C程序没有正确添加浮点数

C program not adding float correctly

我有一个看起来像这样的方法:

float * mutate(float* organism){   
    int i;
    float sign = 1;
    static float newOrg[INPUTS] = {0};

    for (i = 0;i<INPUTS;i++){
        if (rand() % 2 == 0) {
            sign = 1;
        } else {
            sign = -1;
        }
        float temp = (organism[i] + sign);
        printf("bf: %f af: %f diff: %f sign: %f sign2: %f temp: %f\n\n",
            organism[i], (organism[i] + sign), (organism[i] + sign)-organism[i],
            sign, sign+sign, temp);
        newOrg[i] = organism[i] + sign;
    }

    return newOrg;
}

sign 不为 0 时,前两个 "%f" 相同,第三个为 0,将总和放入变量也无济于事。这让我很困惑!如果需要,我可以 post 完整代码。

输出:

bf: 117810016.000000 af: 117810016.000000 diff: 0.000000 sign: 1.000000 sign2: 2.000000 temp: 117810016.000000

float 的有限精度。

一个典型的float只能表示大约232个不同的数字。 117,810,016.0 和 1.0 就是其中的两个。 117,810,017.0 不是。所以 117810016.0 + 1.0 的 C 和导致 117810016.0 的 "best" 答案。

使用像 double 这样的更高精度的类型通常会扩展 +1 精确数学的范围,但即使是足够大的值(通常约为 9.0*10e15)也不会精确 或 253).

如果要使用 float 保留代码,建议将 organism[i] 的值限制在包含范围内或 ±8,388,608.0 (223)。

也许代码可以简单地使用整数类型来完成此任务,例如 long long