众所周知,当您使用printf
输出float
的值时,精度有限。
但是,有一个提高输出精度的技巧,如下例所示:
#include <stdio.h>
int main()
{
float f = 1318926965; /* 10 random digits */
printf("%10.f\n", f); /* prints only 8 correct digits */
printf("%10d\n", *(int*)&f); /* prints all digits correctly */
return 0;
}
我的问题是,为什么人们不经常使用这个技巧?
答案 0 :(得分:11)
您的“随机数”1318926965
具有十进制和浮点形式的相同基础表示。
尝试其他值,例如10
。它将打印为:
10
1092616192
所以回答你的问题:
and my question is, why don't people use this trick more often?
因为一年中只有一天是愚人节......剩下的时间诀窍都行不通了......
答案 1 :(得分:4)
尝试使用不同编号的相同技巧,例如2318926965。
#include <stdio.h>
int main()
{
float f = 2318926965; /* 10 random digits */
printf("%10.f\n", f); /* prints only 8 correct digits */
printf("%10d\n", *(int*)&f); /* prints all digits correctly */
return 0;
}
$ gcc -Wall -O3 t.c
t.c: In function ‘main’:
t.c:7:5: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
$ ./a.out
2318926848
1326069764
我认为你的“技巧”根本不会增加精确度,这取决于平台浮动的位代表(据我所知)。
This thread还有其他一些“神奇花车”和一种生成它们的方法。
答案 2 :(得分:0)
精度限制是浮点表示,而不是printf()
这是一个错误的前提。
此外,单个精度浮点数只能保证精确到6位精度,因此“技巧”会让你自己愚弄;在一般情况下它不会起作用。
如果你想要10位浮点数,那么你应该使用双精度,这对于15位数是好的。