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

时间:2016-04-13 17:01:08

标签: c++ floating-point double floating-accuracy

我们知道double在增加小数点数时它们的值的松散精度。但是,如果我在同一台机器上使用相同的double值两次,那么我保证具有相同的不精确度吗?例如:

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

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

3 个答案:

答案 0 :(得分:2)

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

虽然他们不太可能只是发明自己的,但他们通常在如何代表“不具代表性”的情况下波动(即使在同一供应商内)。数字 - 它们可以用更大的数字或更小的数字来表示 - 这种表示会发生变化(我相信,即使相同 gcc的不同浮动数学选项也会影响这一点)。

答案 1 :(得分:2)

在您的情况下,d1 == d2将返回true,并且几乎将始终在任何正常运行的编译器/体系结构上返回true。即使编译器/体系结构不符合IEEE标准,为123.456提供相同的符号也不太可能在多次调用时返回不同的值。

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

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

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

答案 2 :(得分:0)

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