Кажется, что JDK 8 и JDK 13 имеют разные числа с плавающей запятой. Я получаю JDK 8, используя Math:
cos(2.3) = -0.666276021279824
И на JDK 13:
cos(2.3) = -0.6662760212798241
Как это произошло? Разница показана на процессорах Intel 11-го поколения и AMD Ryzen с использованием Windows 10.
Изменить 20.03.2022:
Используя Long.toHexString(Double.doubleToRawLongBits()), я получаю разные битовые шаблоны:
Я получаю JDK 8:
cos(2.3) = 0xbfe5522217302fe0
И я получаю JDK 13:
cos(2.3) = 0xbfe5522217302fe1
Я использую Double.toString() для отображения результата.
Добавляйте детали в виде правок к вашему Вопросу, а не в виде комментариев.
Что произойдет, если вы используете StrictMath
?
При использовании StrictMath результат JDK 13 совпадает с результатом JDK 8. Оки Доки.
Что бы это ни стоило, используя библиотеки с произвольной точностью, мы можем показать, что точный косинус ближайшего двойного числа к 2,3 расширяется следующим образом ... 302fe09b9492 ... Таким образом, точное значение находится между двумя, ближе к выводу JDK 13.
Похоже, это вызвано встроенной функцией JVM для Math.cos
, которая описана в соответствующей проблеме JDK-8242461. Поведение, испытанное там, не считается проблемой:
The returned results reported in this bug are indeed adjacent floating-point values [this is the case here as well]
[...]
Therefore, while it is possible one or the other of the returned values is outside of the accuracy bounds, just have different return values for Math.cos is not in and of itself evidence of a problem.
For reproducible results, use the StrictMath.cos instead.
И действительно, отключение встроенных функций с помощью -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_dcos
(как предлагается в связанной проблеме) приводит к тому, что Math.cos
будет иметь тот же (ожидаемый) результат, что и StrictMath.cos
.
Таким образом, поведение, которое вы видите здесь, скорее всего, также соответствует документации Math
.
Кроме того: мое (непрофессиональное) предположение состоит в том, что разница между Java 8 и 13 может быть связана с JDK-8143353, который изменил внутренние функции sin
и cos
.
Как вы показываете цифры?