无法将非常小的浮点加在一起吗? C

问题描述 投票:0回答:2

我正在尝试将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;
}
c
2个回答
1
投票

浮点格式不能存储每个数字。

它可以存储的数字分步进行。喜欢

 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

0
投票

您的第二个数字在位置38具有第一个有效数字。当您将总和打印为15个十进制数字时,结果应为1.000000000000000

也无法准确计算总和,因为您至少需要39个有效数字。甚至long double最多只能表示18个有效数字。要打印总和,您需要打印而不将结果存储在一个变量中。例如,打印1和零,然后打印另一个数字的有效数字。

© www.soinside.com 2019 - 2024. All rights reserved.