为什么浮动比它应该更精确?

Lun*_*oms -1 c linux floating-point gcc

#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;
}
Run Code Online (Sandbox Code Playgroud)

我在gcc上得到的输出是:

3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

浮动使用23位mantisa.因此,可以表示的最大分数是2 ^ 23 = 8388608 = 7个精度的十进制数字.

但上面的输出显示精度为23的十进制数字(3.14159274101257324218750).我预计它打印3.1415927 000000000000 ....)

我错过了什么?

sam*_*gak 10

你只有7位数的精度.皮是

3.141592 6535897932384626433832795028841971693993751058209 ...

但是从打印你的浮点近似值得到的输出是

3.141592 74101257324218750000 ...

正如您所看到的,值从小数点后的第7位开始偏离.

如果要求printf()小数位后面的80位数,它将打印出浮点数中存储的二进制值的十进制表示的多个数字,即使这个数字远远超过浮点表示允许的精度.