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
。
我有一个看起来像这样的方法:
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
。