java.lang.Math.log заменен внутренним вызовом, почему бы не java.lang.Math.exp()?

Я задаю вопрос, которому, как мне кажется, уделялось слишком мало внимания:

Почему этот простой код (просто вызов Math.log()):

Double thisdouble = Math.log(10);

С точкой останова в строке 275 Math.class jdk1.7.0_11:

274 public static double log(double a) {
275    return StrictMath.log(a); // default impl. delegates to StrictMath
276 }

Не останавливать выполнение в режиме отладки? Может ли кто-нибудь попробовать это на своей машине (я использую Eclipse)?

Вызов Math.exp() и отладка функции Math.exp(строка 254) действительно работают...

РЕДАКТИРОВАТЬ: ответ на приведенный выше вопрос заключается в том, что Math.log заменяется внутренним вызовом Hotspot VM, поэтому код в классе Math никогда не достигается. Вопрос, который остается сейчас, заключается в том, почему Math.exp не заменяется встроенным ... FWIW У меня Core i5 M520 (Arrandale), но я серьезно сомневаюсь, что этот процессор поддерживает журнал, а не exp ...


person reverse_engineer    schedule 26.02.2013    source источник
comment
Виртуальная машина горячей точки заменяет многие методы в java.lang.Math встроенными функциями, что означает, что вместо прохождения всех циклов, необходимых для вызова метода, она просто вычисляет результат. Что меня удивляет, так это то, что вы можете установить точку останова в Math.exp, которая также должна быть встроенной.   -  person Joni    schedule 27.02.2013
comment
Интересный момент, но не являются ли внутренние свойства просто тем фактом, что вызываемые нативы (в StrictMath) различаются в зависимости от вашей архитектуры? Или виртуальная машина точки доступа (что бы это ни было) действительно заменяет части кода, и это объясняет, почему мы не проходим Math.log? И тогда почему этого не происходит для Math.exp?   -  person reverse_engineer    schedule 27.02.2013
comment
Мое понимание встроенных функций заключается в том, что JVM выполняет кучу внутреннего кода вместо вызова нативного или Java-метода. И это должно произойти с Math.exp а также многие другие методы в java.lang.Math, поэтому вопрос в том, не используется ли встроенная функция для exp или отладчик отключает встроенную функцию для exp, но не для log. В любом случае это выглядит как ошибка.   -  person Joni    schedule 27.02.2013
comment
Да, так что вопрос действительно больше, почему он остановился в exp... Ну, вы в основном ответили на мой вопрос. Спасибо, мой следующий вопрос будет о том, почему log встроен (это слово?), а exp нет...   -  person reverse_engineer    schedule 27.02.2013


Ответы (1)


Я бы предположил, что код в классе Math является лишь резервным кодом, используемым в тех архитектурах, где вызов метода не заменяется вызовом какой-либо собственной операции с плавающей запятой. Таким образом, метод на самом деле не вызывается в вашем случае. Должен признаться, что у меня нет доказательств, подтверждающих это предположение.

person MvG    schedule 27.02.2013
comment
Спасибо за ваш ответ. Действительно, Джони уже более или менее ответил на вопрос. Вызов Math.log заменяется встроенным методом, поэтому класс Math действительно там не используется. Теперь мне интересно, почему Math.exp использует класс Math... - person reverse_engineer; 28.02.2013
comment
@reverse_engineer: разница между log и exp должна быть удалена в более поздних выпусках OpenJDK. - person MvG; 28.02.2013