为什么这个c程序会给出“错误”的输出?
#include<stdio.h>
void main()
{
float f = 12345.054321;
printf("%f", f);
getch();
}
输出:
12345.054688
但输出应该是,
12345.054321
。我在vc++中使用vc++。
最佳答案
它给出了一个“错误”的答案,仅仅是因为并不是所有的实际值都可以用浮点数来表示(或者说是双倍)。您将得到的是基于底层编码的近似值。
为了表示每一个实际值,即使在1.0x10-100和1.1x10-100之间(一个非常小的范围),仍然需要无限个位。
单精度IEEE754值只有32位可用(其中一些用于指数和NaN/INF表示等其他任务),因此无法提供无限精度。它们实际上有23位可用,精度约为224(有一个额外的隐式位)或略高于7位小数(log10(224)约为7.2)。
我用引号把“错”这个词括起来,因为它实际上并没有错。错的是你对计算机如何表示数字的理解(尽管不要生气,你并不是唯一一个被误解的人)。
转到http://www.h-schmidt.net/FloatApplet/IEEE754.html并在“十进制表示法”框中键入您的数字,以查看此操作。
如果您想要一个更精确的数字,请使用doubles而不是float—它们的位数是表示值的位数的两倍(假设您的c实现分别使用ieee754单精度和双精度数据类型作为float和double)。
如果您想要任意精度,您将需要使用一个类似GMP的“bignum”库,尽管这比本机类型慢一些,因此请确保您理解权衡。