java - Java 浮点基元是否有任何 IEEE 754 标准实现?

标签 java floating-point double bigdecimal ieee-754

我对 Java 是否使用 IEEE 754 标准来实现其浮点运算感兴趣。 Here我在文档中看到了这种东西:

operation defined in IEEE 754-2008

据我所知,IEEE 754 的积极方面是提高浮点运算的精度,因此如果我在 Java 中使用 doublefloat,计算的精度将相同和 BigDecimal 一样吗?如果不是,那么在 Math 中使用 IEEE 754 标准有什么意义呢?类(class)?

最佳答案

I'm interested if Java is using IEEE 754 standard for implementing it's floating point arithmetic.

IEEE-754 定义了多个 浮点类型的标准。多年来,它们都是二进制 float ;这就是 Java 的 floatdouble 是:float 是一个 32 位 IEEE-754 二进制浮点值(标准称为 binary32 ). double 是 64 位的(标准称为 binary64 )。这些二进制 float 对于计算机来说计算效率很高,但是因为它们以二进制工作而我们以十进制工作,所以存在一些期望不匹配;例如,0.1 不能精确地存储在 double 中,您会得到像 0.1 + 0.2 这样的奇怪结果,结果是 0.30000000000000004。参见 Is floating point math broken?了解详情。例如,它们不是财务计算的好选择。

BigDecimal 是一个 Java 类,它以任意精度实现 decimal 小数。它比使用 double 慢得多,但结果符合我们对小数的期望(例如,0.1 + 0.2 将是 0.3) .

IEEE-754 的 2008 版增加了重要的新格式,特别是 decimal32 , decimal64 , 和 decimal128 .这些是十进制 float ,因此它们的工作方式与我们相同。 0.1可以准确的存储在一个decimal64中。 0.1 + 0.2decimal64 中是 0.3。但是,据我所知,它们与您的问题并不相关。

由于 BigDecimal 早于 IEEE-754 2008(在一定程度上),它定义了自己的语义。

And if not than what's the point of using IEEE 754 standard in Math class?

JDK9 向 Math 添加了新的操作,这些操作执行 IEEE-754 2008 规范定义的操作(例如 fma ,它执行 fused multiply-add ),因此它通过引用定义了这些操作为清楚起见,符合 IEEE-754 2008 规范。

更多阅读:

关于java - Java 浮点基元是否有任何 IEEE 754 标准实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40300041/

相关文章:

java - EhCache 使用过多的堆内存来存储值

c - 如何根据输入的数字将答案设为 float 或整数?

java - 使用java解压二进制php packed float

java - 如何正确地将 double 从服务发送到 Activity

java - 是否应该有任何线程驻留在线程池之外?

java - 创建嵌套选项卡时遇到问题

java - Hibernate - 从模式创建类

c++ - 1e-9 或 -1e9,哪一个是正确的?

date - 什么是小数秒?

c++ - 四舍五入/截断双