c++ - 为什么 10000000000000000 != 10000000000000000?

标签 c++ c

首先,在 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.0float范围内。为什么我们无法使用 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/

相关文章:

c++ - C++中指向成员的指针

c++ - boost scoped_lock 与普通锁定/解锁

c++ - 是否可以在 C/C++ 中声明全局二维数组?

C函数使用指针更改字符串

c - 写入缓冲区与直接写入文件

c++ - 该程序的有效算法

c++ - C++/SDL2 —渲染圆

c++ - MySQL 中的 where 子句如何工作?

c - 无法证明输出的合理性

c - 为什么 UEFI 协议(protocol)头文件为单个协议(protocol) GUID 定义宏和外部全局变量?