浮动不添加?

时间:2018-10-11 01:41:47

标签: c floating-point addition

我正在尝试设计一个程序来计算和显示多少秒,直到当前人口达到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;

也是,但结果没有变化。

3 个答案:

答案 0 :(得分:7)

float的最常用格式中,IEEE-754基本32位二进制格式的7600000000附近的可表示值为7599999488、7600000000和7600000512。这是因为32位格式仅使用24有效位(小数部分)的位。要表示7600000000,必须设置指数,以便有效位数的高位表示4294967296(2 32 ),这意味着低位表示512(2 9 )。因此,此时以512为单位递增到可表示的数字。

当将2.5加到7600000000时,数学结果7600000002.5会四舍五入到最接近的可表示值,因此最终结果是7600000000。

double的最常用格式中,有效位数为53位,因此可以将半个数字(2 -1 )表示为2 53 (9007199254740992)。

注意:此答案假定正在使用通用格式。如果需要更大的可移植性,则C实现在<float.h>中提供有关其浮点信息的信息。该信息可用于测试floatdouble格式是否提供足够的精度。

答案 1 :(得分:3)

假设float是IEEE754单精度浮点类型,则它最多只能容纳大约8个十进制数字的精度。因此,将值2.5添加到7600000000超出了该类型可以容纳的精度,这意味着结果最终为7600000000。所以您将遇到无限循环。

将数据类型更改为double,它的精度更高。然后循环应该结束。

此外,您正在使用%f格式说明符来打印secondCount,它是一个整数。您应该改用%d

答案 2 :(得分:0)

此外,您可能要检查计算机上的sizeof(float)值,因为可以存储在其中的最大值可能小于7600000000.0或8000000000.01