double 值的不精确性是否保证在同一台机器上是一致的?

Is imprecision of a double value guaranteed to be consistent on the same machine?

我们知道,double随着小数位数的增加,其值的精度会降低。但是,如果我在同一台机器上两次使用相同的 double 值,我是否会 保证 具有相同的不精确性?例如:

double d1 = 123.456;//actually becomes 123.45600001
double d2 = 123.456;//is guaranteed to become 123.45600001?

为简单起见,让我们坚持使用 C++。

不,您没有此保证。 C++ 实现不受 IEEE 标准的约束,可以选择他们想要的任何二进制表示。

虽然他们不太可能只是发明自己的数字,但他们通常在表示 'nonrepresentable' 数字的方式上有所波动(即使在同一供应商内部也是如此)——它们可以用更大或更小的数字表示- 这种表示发生了变化(我相信,即使 same gcc 的不同浮动数学选项也会影响这一点)。

在您的情况下,d1 == d2 将 return true,并且 几乎 总是 return 正确运营 compiler/architecture。即使 compiler/architecture 不符合 IEEE,为 123.456 提供相同的符号也极不可能在多次调用时 return 产生不同的值。

但是,如果您有以下代码:

double d1 = 123.456;
double d2 = get_123_456_from_network_service(service);

这种保证将不再存在。 123.456 在您的计算机上始终完全相同,但如果另一台计算机尝试使用相同的符号,并且不符合 IEEE(或者如果您的不符合),那么很有可能值会有所不同。

如果您的编译器符合 IEEE 754 (IEC 559) 标准,它们应该是相同的。您可以检查它是否符合 IEEE std::numeric_limits<T>::is_iec559。大多数实现都符合 IEEE,但这不是保证。