C程序给出与计算器不同的答案

时间:2014-07-12 19:37:55

标签: c

我正在尝试K.N.的C Programming a Modern Approach中的这个练习。金和我不确定我做错了什么。作者网站上没有正确的答案。这是问题:

http://i.imgur.com/kgFD9pN.png

  

编写一个计算10米球体积的程序   半径,使用公式v = 4 /3πr 3 。将分数4/3写为4.0f / 3.0f。   (尝试将其写成4/3。会发生什么?)提示: C没有   exponention运算符,所以你需要将r自身乘以两次   计算r 3

注意正确的输出(由(4/3)* 3.14 * 1000给出)是4186.6666 ... 67,但我的代码输出41866.667969。我认为这是由于数据类型导致的某种舍入误差(至少从我从这个问题/答案中推断出来的Why does C give me a different answer than my calculator?

这是我的代码:

//Sphere computation
//Formula = v= 4.0f / 3.0f * 3.14 (pi) * r^3 (a = r*r, b = a*a)

#include <stdio.h>

int main(void)
{
    float volume, pi, fraction, radiusOne, radiusSquared, radiusCubed;

    radiusOne = 10.0f;
    pi = 3.14f;
    fraction = 4.0f / 3.0f;

    radiusSquared = radiusOne * radiusOne;
    radiusCubed = radiusSquared * radiusSquared;
    volume = fraction * pi * radiusCubed;

    printf("Volume: %f\n", volume);

    return 0;
}

3 个答案:

答案 0 :(得分:3)

你的回答是十分之一,因为这两行不正确:

radiusSquared = radiusOne * radiusOne;
radiusCubed = radiusSquared * radiusSquared;

这计算R 4 ,而不是R 3 ,因为R 2 * R 2 = R 4

你可能打算写

radiusSquared = radiusOne * radiusOne;
radiusCubed = radiusSquared * radiusOne;

您可以使用pow(R, 3)来计算答案,或只使用radiusCubed = radiusOne * radiusOne * radiusOne

答案 1 :(得分:2)

尝试改变这一点:

radiusCubed = radiusSquared * radiusSquared;  //This makes it to the power of 4

radiusCubed = radiusSquared * radiusOne;    //This makes it to the power of 3

radiusCubed = radiusOne * radiusOne * radiusOne;   //This makes it to the power of 3

答案 2 :(得分:1)

你写过

radiusSquared = radiusOne * radiusOne;
radiusCubed = radiusSquared * radiusSquared;

假设radiusOne初始化为10,radiusSquared将为100.然后当你自己乘以它时,你产生的结果是radiusCubed将是10,000而不是1,000它应该是。

请改用:

radiusCubed = radiusOne * radiusOne * radiusOne;

问题所在

  

你需要自己将r乘以两次

它意味着后一种形式,而不是你应该将它自身相乘,然后将结果乘以它自己。

部分舍入问题确实与你问题中的链接有关 - 使用双精度浮点而不是单精度将几乎消除这一点。其他舍入问题源于您使用3.14作为pi的近似值,而不是更精确。要使用的正确值是math.h

中定义的值
#define M_PI 3.14159265358979323846