【发布时间】:2015-03-31 04:39:37
【问题描述】:
#include <stdio.h>
#include <float.h>
int main(int argc, char** argv)
{
long double pival = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899L;
float pival_float = pival;
printf("%1.80f\n", pival_float);
return 0;
}
我在 gcc 上得到的输出是:
3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
浮点数使用 23 位尾数。所以可以表示的最大分数是 2^23 = 8388608 = 7 位小数精度。
但上面的输出显示了 23 个十进制数字的精度 (3.14159274101257324218750)。我预计它会打印 3.1415927000000000000....)
我错过了什么?
【问题讨论】:
-
浮点数是二进制。他们没有有“精确的十进制数字”。
-
其实float有24位有效位(23位尾数+1个隐藏位)
-
试试
printf("%a\n", pival_float)
标签: c linux gcc floating-point