Coretto Java с плавающей точкой
У Java обычно была проблема с включением арифметики с плавающей запятой и включением пронормальных значений при выполнении таких операций:
double a = 0.1;
double b = 0.1;
double x = a*b;
out.println();
out.println(x);
с помощью поплавка или двойных типов.
Может кто-нибудь сказать мне, как заставить Coretto Java войти в ненормированный, точный режим с плавающей запятой?
1 ответ
"Может, кто-нибудь подскажет, как заставить Coretto Java перейти в ненормативный, точный режим с плавающей запятой?"
Это не специфическая для Корретто проблема. Это общая проблема Java. Простой ответ такой же, как и в других версиях OpenJDK.
Вы не можете использовать примитивные типы Java, такие как float и double. Вы должны прибегнуть к другой математической библиотеке. java.math. BigDecimal может быть хорошим началом.
jshell> import static java.math.BigDecimal.*;
jshell> var a = ONE.divide(TEN)
a ==> 0.1
jshell> var b = ONE.divide(TEN)
b ==> 0.1
jshell> a.add(b)
$16 ==> 0.2
TLDR:
Примитивные типы float и double определены в спецификации языка Java. Java реализует определение IEEE 754 их представления.
4.2.3. Типы с плавающей запятой, форматы и значения Типы с плавающей запятой - это числа с плавающей запятой и двойные, которые концептуально связаны со значениями и операциями IEEE 754 32-разрядного и 64-разрядного формата одинарной точности, как указано в стандарте IEEE для Двоичная арифметика с плавающей точкой, стандарт ANSI/IEEE 754-1985 (IEEE, Нью-Йорк).
https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html
В результате ожидается следующий вывод из-за двоичного представления IEEE 754.
jshell> double a = 0.1;
a ==> 0.1
jshell> double b = 0.1;
b ==> 0.1
jshell> double x = a*b;
x ==> 0.010000000000000002
Рекомендации:
Существуют ли какие-либо стандартные реализации IEEE 754 для примитивов с плавающей точкой Java?