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?

Другие вопросы по тегам