如何解决此C ++代码-浮点型或双精度型问题?

时间:2018-09-01 14:41:54

标签: c++

#include <stdio.h>

int main()
{
    int i;
    const int N = 4;
    double a=0, b=0, c=0, d=0;

    for (i = 1 ; i <= N ; i++)
    {
        a += i;
        b += i * i;
    }

    c = a / N;
    d = b / N - c * c;

    printf("%.0f\n", d);

    return 0;
}

其结果为1,但我不知道结果为何为1。我认为c是3,而N-c*c是-2.25,所以d是-13 ,所以我认为打印d的结果是-13,但结果是1。

此结果来自何处?

2 个答案:

答案 0 :(得分:1)

这是因为您没有注意到为解决方案选择的算法。 for循环进行迭代,并使变量a = 1+2+3+4b = 1^2+2^2+3^3+4^4 然后a = 10b = 30生成c=2.5d=7.5-2.5^2=1.25,然后选择打印 %.0f,您将获得一个。 如果要以2点精度打印浮点,请使用%.2f

答案 1 :(得分:1)

for循环之后,a为10.0,而b为30.0。然后为c分配了10.0 / 4,因此c2.5。下一行等效于d = (30.0 / 4) - (2.5 * 2.5),因此d7.5 - 6.25,即1.25。然后,您用printf()"%.0f"参数修剪所有小数,因此剩下的就是1。与之类似,它是1.25向下取整版本。

如果将打印行更改为:

printf("%f\n", d);

然后,您将看到特定的d的所有十进制数字。

同样,在给定.0的格式字符串中,%之后f之前的printf()决定了要打印的小数位数。超出的任何数字都将四舍五入。