首先,在 Visual Studio 中使用 C++ 查看以下代码:
float a = 10000000000000000.0;
float b = a - 10000000000000000.0;
打印出来时,结果是:
a = 10000000272564224.000000
b = 272564224.000000
当在 Debug 下的 Watch 中查看它们时,结果是:
-Name- -Value- -Type-
a 1.0000000e+016 float
b 2.7256422e+008 float
前题:我确定10000000000000000.0在float
范围内。为什么我们无法使用 float
获得正确的 a/b?
跟进问题: 对于预提问,基于以下所有出色的答案。我知道原因是 32 位 float 的精度约为 7 位数字,因此超过前 6-7 位数字,所有赌注均无效。这就是为什么数学无法计算出来,并且对于这些大数字来说打印看起来是错误的。我必须使用 double 以获得更高的准确性。那么,为什么 float 声称能够处理大量数字,同时我们又不能相信它?
最佳答案
你用的这个大数确实在float的“范围”之内,但并不是它所有的数字都在float的“精度”之内。 32 位 float 的精度约为 7 位数字,因此超出前 6-7 位数字,所有赌注均无效。这就是为什么当您使用这些大数字时数学无法计算出来并且打印看起来“错误”的原因。如果您想要更高的准确性,请使用 double。有关更多信息,请参阅 http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers
关于c++ - 为什么 10000000000000000 != 10000000000000000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18877902/