我们知道,随着小数点数量的增加,double
的值精度会降低。但是,如果我在同一台机器上两次使用相同的double
值,我会保证具有相同的不精确性吗?例如:
double d1 = 123.456;//actually becomes 123.45600001
double d2 = 123.456;//is guaranteed to become 123.45600001?
为了简单起见,让我们只使用C++。
不,您没有此保证。C++实现不受IEEE标准的约束,并且可以选择他们想要的任何二进制表示。
虽然他们不太可能只是发明自己的数字,但他们通常会在表示"不可表示"数字的方式上有波动(即使在同一供应商内)——他们可以用更大的数字或更小的数字表示——这种表示方式会发生变化(我相信,即使是相同gcc的不同浮动数学选项也会影响这一点)。
在您的情况下,d1 == d2
将返回true
,并且在任何正确操作的编译器/体系结构上,它几乎总是返回true。即使编译器/体系结构不符合IEEE,为123.456
提供相同的符号也不太可能在多次调用时返回不同的值。
但是,如果你有以下代码:
double d1 = 123.456;
double d2 = get_123_456_from_network_service(service);
这种保证将不再有效。123.456
在你的计算机上一直都是完全相同的,但如果不同的计算机试图使用相同的符号,并且不符合IEEE(或者如果你的计算机不符合IEEE),那么很有可能值会不同。
如果您的编译器符合IEEE 754(IEC 559)标准,那么它们应该是相同的。您可以检查它是否符合IEEE std::numeric_limits<T>::is_iec559
。大多数实现都符合IEEE,但这并不能保证。