Java 限于整数的浮点算法

Java 限于整数的浮点算法,java,floating-point,Java,Floating Point,我使用double来统一实现一些算术计算。这些计算可能实际上也适用于整数,但Java中没有类似C++的模板,我不想复制实现代码,所以我只对ints使用双版本 JVM规范是否保证整数操作的正确性,例如当操作被模拟为相应的浮点操作时,余数=、+、-、*,和/或余数==0 当然,任何整数都有合理的大小,可以用double的尾数表示 double a = 3.0; double b = 2.0; System.out.println(a*b); // 6.0 System.out.println(a+

我使用double来统一实现一些算术计算。这些计算可能实际上也适用于整数,但Java中没有类似C++的模板,我不想复制实现代码,所以我只对ints使用双版本

JVM规范是否保证整数操作的正确性,例如当操作被模拟为相应的浮点操作时,余数=、+、-、*,和/或余数==0

当然,任何整数都有合理的大小,可以用double的尾数表示

double a = 3.0;
double b = 2.0;

System.out.println(a*b); // 6.0
System.out.println(a+b); // 5.0
System.out.println(a-b); // 1.0
System.out.println(a/b); // 1.5 // if you want to get 1 here you should cast it to `integer (int)`
System.out.println(a>=b); // true
System.out.println(a<=b); // false
但在乘法*时要小心,因为a*b在强制转换为整数时会导致溢出。+和-

的情况大致相同是的

double a = 3.0;
double b = 2.0;

System.out.println(a*b); // 6.0
System.out.println(a+b); // 5.0
System.out.println(a-b); // 1.0
System.out.println(a/b); // 1.5 // if you want to get 1 here you should cast it to `integer (int)`
System.out.println(a>=b); // true
System.out.println(a<=b); // false
但在乘法*时要小心,因为a*b在强制转换为整数时会导致溢出。+和-

的情况相同,根据:

浮点数上的运算符 按照IEEE 754的规定,使用 余数的例外 运营商§15.17.3

因此,我们保证了统一的行为,虽然我没有访问IEEE的官方标准文档,但我非常确定,它隐含地保证了可以准确表示为浮点/双精度的整数上的操作能够按预期工作

根据:

浮点数上的运算符 按照IEEE 754的规定,使用 余数的例外 运营商§15.17.3


因此,我们保证了统一的行为,虽然我没有访问IEEE的官方标准文档,但我非常确定,它隐含地保证了可以准确表示为浮点/双精度的整数上的操作能够按预期工作

事实上,我已经找到了标准,它说是的

JVM规范:

Java虚拟机的舍入操作始终使用IEEE 754舍入 最近模式。不精确的结果四舍五入到最近的可表示值,与最低有效位为零的值相关。这是IEEE 754默认模式。但Java虚拟机指令将浮点类型的值转换为整数类型的值,并向零舍入。Java虚拟机不提供任何方法来更改浮点舍入模式

ANSI/IEEE标准754-1985 5。 ... 除二进制-十进制转换外,执行每项操作时,应将其视为首先生成一个中间结果,该中间结果精确到无限精度并具有无限范围,然后强制该中间结果符合目标格式

ANSI/IEEE标准754-1985 5.4。 浮点整数和整数格式之间的转换应精确,除非出现7.1中规定的例外情况

总结

1如果结果符合双精度格式,则精确运算总是精确的,因此,整数结果总是浮点整数。
浮点整数的2整数双精度转换总是精确的。

事实上,我已经找到了标准,它说是的

JVM规范:

Java虚拟机的舍入操作始终使用IEEE 754舍入 最近模式。不精确的结果四舍五入到最近的可表示值,与最低有效位为零的值相关。这是IEEE 754默认模式。但Java虚拟机指令将浮点类型的值转换为整数类型的值,并向零舍入。Java虚拟机不提供任何方法来更改浮点舍入模式

ANSI/IEEE标准754-1985 5。 ... 除二进制-十进制转换外,执行每项操作时,应将其视为首先生成一个中间结果,该中间结果精确到无限精度并具有无限范围,然后强制该中间结果符合目标格式

ANSI/IEEE标准754-1985 5.4。 浮点整数和整数格式之间的转换应精确,除非出现7.1中规定的例外情况

总结

1如果结果符合双精度格式,则精确运算总是精确的,因此,整数结果总是浮点整数。
2整数双精度转换对于浮点整数总是精确的。

谢谢,好消息,但这种行为是JVM/IEEE规范保证的,还是实验事实?println也可能是双精度整数,因此printed 3.0在机器代码中可能是2.9999999999。这是JVM/IEEE规范保证的,请阅读@Michael的评论谢谢,好消息,但这是JVM/IEEE规范保证的行为,还是实验事实?println也可能是双精度整数,因此printed 3.0在机器代码中可能是2.9999999999。它由JVM/IEEE规范保证,请阅读@Michael的评论