首先,看看Visual中使用C++的以下代码:
float a = 10000000000000000.0;
float b = a - 10000000000000000.0;打印出来时,结果是:
a = 10000000272564224.000000
b = 272564224.000000当在“Debug下监视”中查看它们时,结果是:
-Name- -Value- -Type-
a 1.0000000e+016 float
b 2.7256422e+008 float10000000000000000.0:我确信在float的范围内.为什么我们不能使用获得正确的/ b
Followup-question:的预问题,基于所有伟大的以下答案.我知道原因是32位浮点数的精度约为7位,所以除了前6-7位数字外,所有的赌注都取消了。这就是为什么数学计算不出结果的原因,而且打印这些大数字看起来是错误的。我得用双倍才能更准确。那么,为什么声称能够处理大量的数字,同时又不能信任它呢?
发布于 2013-12-22 07:58:28
您所使用的庞大数字确实在浮动的“范围”之内,但并不是所有的数字都在浮点数的“精度”之内。32位浮点数的精度约为7位,所以除了前6-7位数字外,所有的赌注都取消了。这就是为什么数学不可行的原因,当你使用这些大的数字时,打印看起来是“错误的”。如果你想要更准确,使用双倍。有关更多信息,请参见computers
发布于 2013-12-22 07:59:04
浮点数大约需要6-7位小数位(小数为23位),所以任何小数位数较多的数字都只是一个近似。这就导致了这个数字。
有关浮点格式精度的更多信息:format
用于更新的问题:,当需要精度时,不应该使用浮点格式。我们不能只指定更大的内存空间。处理小数位数量很大的数字需要非常大的内存,.So使用了更复杂的方法(例如使用字符串格式,然后依次处理字符)。
为了避免这个问题,请使用double,它给出16到17位的小数位(分数是52位),或者使用long double来获得更高的精度。
#include <stdio.h>
int main()
{
double a = 10000000000000000.0;
double b = a - 10000000000000000.0;
printf("%f\n%f", a, b);
}示例http://ideone.com/rJN1QI
发布于 2013-12-22 08:07:58
您的困惑是由隐式转换和缺乏float的准确性造成的。
让我为你填写隐含的转换:
float a = (float)10000000000000000.0;
float b = (float)((double)a - 10000000000000000.0);这会将文字double转换为float,并且它能得到的最接近的值是10000000272564224。然后使用double而不是float执行减法,因此第二个10000000000000000.0不会丢失精度。
https://stackoverflow.com/questions/18877902
复制相似问题