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

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

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,同时将总和放在变量中没有帮助。 这令我困惑! 如果需要,我可以发布完整的代码。

输出:

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

float有限精度。

典型的float只能代表大约2 32个不同的数字。 117,810,016.0和1.0是其中两个。 117,810,017.0不是。 所以C总和117810016.0 + 1.0得出117810016.0 + 1.0的“最佳”答案。

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

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

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