我们知道double
在增加小数点数时它们的值的松散精度。但是,如果我在同一台机器上使用相同的double
值两次,那么我保证具有相同的不精确度吗?例如:
double d1 = 123.456;//actually becomes 123.45600001
double d2 = 123.456;//is guaranteed to become 123.45600001?
为简单起见,我们坚持使用C ++。
答案 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标准,但这不是保证。