浮动不添加?
Floats not adding?
我正在尝试设计一个程序来计算和显示当前人口达到 80 亿之前还有多少秒。我认为我的逻辑是合理的,但我的 while 循环无限循环,我不明白为什么。
我习惯了 C++,但这是我第一次用 C 编写,所以我想知道是否有我遗漏的语法问题。
// Program to calculate population increase
// to see how many seconds from now
// the population will hit 8 billion
#include <stdio.h>
#include <math.h>
int main()
{
float currentPop = 7600000000.0;
float increasePerSec = 2.5;
int secondCount = 0;
printf("Counting...\n");
while (currentPop < 8000000000.01)
{
currentPop += increasePerSec;
secondCount++;
}
printf("It will be %f seconds from now.\n",secondCount);
return 0;
}
这一行似乎存在问题:
currentPop += increasePerSec;
因为价值始终停留在76亿。以防万一我试过了:
currentPop = currentPop + increasePerSec;
同样,但结果没有变化。
另外,您可能需要检查计算机上的sizeof(float) 的值,因为它可以存储的最大值可能小于7600000000.0 或8000000000.01
在float
最常用的格式中,IEEE-754基本32位二进制格式,7600000000附近可表示的值为7599999488、7600000000、7600000512。这是因为32位格式使用只有 24 位用于有效数字(小数部分)。要表示 7600000000,必须设置指数,使尾数的高位表示 4294967296 (232),这意味着低位表示 512 (29).因此,此时可表示数字的增量以 512 为单位。
7600000000 加上 2.5 时,数学结果 7600000002.5 四舍五入到最接近的可表示值,因此最终结果为 7600000000。
在double
最常用的格式中,尾数有53位,所以半数(2−1)可以表示到253 (9007199254740992).
注意:此答案假设使用的是通用格式。如果需要更大的可移植性,C 实现会在 <float.h>
中提供有关其浮点信息的信息。该信息可用于测试 float
或 double
格式是否提供足够的精度。
假设 float
是 IEEE754 单精度浮点类型,它最多只能容纳大约 8 位十进制数字的精度。因此,将值 2.5 添加到 7600000000 超出了此类型可以容纳的精度,这意味着结果最终为 7600000000。因此您有一个无限循环。
将数据类型更改为 double
,精度更高。然后循环应该结束。
此外,您正在使用 %f
格式说明符来打印 secondCount
,它是一个 int。您应该改用 %d
.
我正在尝试设计一个程序来计算和显示当前人口达到 80 亿之前还有多少秒。我认为我的逻辑是合理的,但我的 while 循环无限循环,我不明白为什么。
我习惯了 C++,但这是我第一次用 C 编写,所以我想知道是否有我遗漏的语法问题。
// Program to calculate population increase
// to see how many seconds from now
// the population will hit 8 billion
#include <stdio.h>
#include <math.h>
int main()
{
float currentPop = 7600000000.0;
float increasePerSec = 2.5;
int secondCount = 0;
printf("Counting...\n");
while (currentPop < 8000000000.01)
{
currentPop += increasePerSec;
secondCount++;
}
printf("It will be %f seconds from now.\n",secondCount);
return 0;
}
这一行似乎存在问题:
currentPop += increasePerSec;
因为价值始终停留在76亿。以防万一我试过了:
currentPop = currentPop + increasePerSec;
同样,但结果没有变化。
另外,您可能需要检查计算机上的sizeof(float) 的值,因为它可以存储的最大值可能小于7600000000.0 或8000000000.01
在float
最常用的格式中,IEEE-754基本32位二进制格式,7600000000附近可表示的值为7599999488、7600000000、7600000512。这是因为32位格式使用只有 24 位用于有效数字(小数部分)。要表示 7600000000,必须设置指数,使尾数的高位表示 4294967296 (232),这意味着低位表示 512 (29).因此,此时可表示数字的增量以 512 为单位。
7600000000 加上 2.5 时,数学结果 7600000002.5 四舍五入到最接近的可表示值,因此最终结果为 7600000000。
在double
最常用的格式中,尾数有53位,所以半数(2−1)可以表示到253 (9007199254740992).
注意:此答案假设使用的是通用格式。如果需要更大的可移植性,C 实现会在 <float.h>
中提供有关其浮点信息的信息。该信息可用于测试 float
或 double
格式是否提供足够的精度。
假设 float
是 IEEE754 单精度浮点类型,它最多只能容纳大约 8 位十进制数字的精度。因此,将值 2.5 添加到 7600000000 超出了此类型可以容纳的精度,这意味着结果最终为 7600000000。因此您有一个无限循环。
将数据类型更改为 double
,精度更高。然后循环应该结束。
此外,您正在使用 %f
格式说明符来打印 secondCount
,它是一个 int。您应该改用 %d
.