我正在尝试将1和0.0000000000000000000000000000000000000000000117549435 ...(2 **-126)加在一起,但是由于某种原因,我得到了打印的数字1。我是C语言的新手,我猜它与IEEE754有关吗?我曾尝试使用双打和长双打,但我没有得到所需的结果。不知道是否会更改任何内容,但我需要150个十进制数字。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <float.h>
int main() {
float num;
float example;
num = 1;
example = 1*pow(2, -126);
num = num + example
printf("%.150f", num);
return 0;
}
浮点格式不能存储每个数字。
它可以存储的数字分步进行。喜欢
1.00000000000000000000000
1.00000011920928955078125
1.00000023841857910156250
1.00000035762786865234375
...
所以就是您要存储的号码,即
1.0000000000000000000000000000000000000117549435..
不能以浮点格式表示。
尝试此程序:
#include <stdio.h>
#include <assert.h>
union
{
float f;
unsigned u;
} val;
int main() {
assert(sizeof(float) == 4);
assert(sizeof(unsigned) == 4);
val.u = 0x3f800000;
printf("0x%08x -> %.50f\n", val.u, val.f);
++val.u;
printf("0x%08x -> %.50f\n", val.u, val.f);
++val.u;
printf("0x%08x -> %.50f\n", val.u, val.f);
++val.u;
printf("0x%08x -> %.50f\n", val.u, val.f);
return 0;
}
输出:
0x3f800000 -> 1.00000000000000000000000000000000000000000000000000
0x3f800001 -> 1.00000011920928955078125000000000000000000000000000
0x3f800002 -> 1.00000023841857910156250000000000000000000000000000
0x3f800003 -> 1.00000035762786865234375000000000000000000000000000
您的第二个数字在位置38具有第一个有效数字。当您将总和打印为15个十进制数字时,结果应为1.000000000000000
。
也无法准确计算总和,因为您至少需要39个有效数字。甚至long double
最多只能表示18个有效数字。要打印总和,您需要打印而不将结果存储在一个变量中。例如,打印1
和零,然后打印另一个数字的有效数字。