C++ 标准不保证IEEE 754 浮点运算 https://en.wikipedia.org/wiki/IEEE_floating_point使用,因此结果实际上是实现定义的。然而,大多数实现都会这样做。
在爪哇,float
and double
被定义为 IEEE 754 浮点类型 http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3。此外,您还可以添加strictfp http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.4类或方法声明的修饰符,要求即使对于中间结果也使用严格的 IEEE 754 浮点算术。
在处理浮点数时,如果有疑问,查看实际的位表示通常很有用。
#include <cstdint>
#include <cstdio>
int
main()
{
static_assert(sizeof(double) == sizeof(uint64_t), "wrong bit sizes");
const double x = 0.1 + 0.2;
const uint64_t bits = *reinterpret_cast<const uint64_t *>(&x);
printf("C++: 0x%016lX\n", bits);
return 0;
}
public final class Main {
public static void main(final String[] args) {
final double x = 0.1 + 0.2;
final long bits = Double.doubleToLongBits(x);
System.out.printf("Java: 0x%016X\n", bits);
}
}
当我在我的计算机(带有 GCC 和 OpenJDK 的 GNU/Linux)上执行这两个程序时,输出为
C++: 0x3FD3333333333334
Java: 0x3FD3333333333334
这表明两者产生完全相同的结果。然而,可移植程序不应该依赖于此。