带有printf的浮子的精度

时间:2012-04-01 08:51:29

标签: c floating-point printf precision

众所周知,当您使用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;
}

我的问题是,为什么人们不经常使用这个技巧?

3 个答案:

答案 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位数是好的。