我正在尝试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;
}
答案 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