【问题标题】:Coretto Java Floating PointCorretto Java 浮点数
【发布时间】:2019-02-14 02:02:00
【问题描述】:

Java 通常存在包含浮动的问题 点算术非正规和非正规值包含 像这样的操作:

double a = 0.1;
double b = 0.1;
double x = a*b;
out.println();
out.println(x);

通过 float 或 double 类型。

谁能告诉我如何告诉 Coretto Java 进入非反规范、精确的浮点模式?

【问题讨论】:

  • 我们已经删除了您针对 Coretto 开发人员的问题中的句子。如果您想联系他们(例如请求新功能或报告错误),常见问题解答中说明了您可以如何做到这一点:aws.amazon.com/corretto/faqs

标签: java corretto


【解决方案1】:

“谁能告诉我如何告诉 Coretto Java 输入非 非正规、精确的浮点模式?”

这不是 Corretto 特有的问题。这是一个一般的 Java 问题。简单的答案与您在其他版本的 OpenJDK 中的操作方式相同。

您不能使用浮点和双精度等 Java 原始类型。您必须求助于另一个数学库。 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。浮点类型、格式和值 浮点类型是 float 和 double,它们在概念上与 单精度 32 位和双精度 64 位格式 IEEE 754 IEEE 二进制标准中指定的值和操作 浮点运算,ANSI/IEEE 标准 754-1985(IEEE,新 约克)。

https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.3

因此,由于 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

参考资料:

Is there any IEEE 754 standard implementations for Java floating point primitives?

【讨论】:

  • 尽管具有兼容性,Corretto 是否有可能获得同时运行时切换或辅助模式,从而允许范围精确的浮点行为?
  • Corretto 不支持它。 IIRC,我不知道任何 Java 实现都支持它。 Java 是一种通用编程语言。正如我之前所说,您可以求助于图书馆来支持它。这与 C/C++ 相同。如果数字应用程序是您的主要考虑因素,我认为 Python 是更好的选择。
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多