[英]C program giving different answer than calculator
我正在嘗試用KN King的C編程現代方法進行此練習,但不確定自己在做什么錯。 作者網站上沒有正確的答案。 這是問題:
http://i.imgur.com/kgFD9pN.png
寫,計算與10米半徑的球體的體積,用公式V = 4/33πR的程序。 將分數4/3寫為4.0f / 3.0f。 (嘗試將其寫為4/3。會發生什么?) 提示: C沒有指數運算符,因此您需要將r自身相乘兩次才能計算出r 3 。
注意正確的輸出(由(4/3)* 3.14 * 1000給出)是4186.6666 ... 67,但是我的代碼輸出41866.667969。 我認為這是由於數據類型引起的舍入錯誤(至少從我從這個問題/答案中得出的結論來看, 為什么C給我的答案不同於我的計算器? )
這是我的代碼:
//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;
}
您的答案相差十,因為這兩行不正確:
radiusSquared = radiusOne * radiusOne;
radiusCubed = radiusSquared * radiusSquared;
因為R 2 * R 2 = R 4 ,所以計算R 4而不是R 3 。
你可能想寫
radiusSquared = radiusOne * radiusOne;
radiusCubed = radiusSquared * radiusOne;
您可以使用pow(R, 3)
來計算答案,或者簡單地使用radiusCubed = radiusOne * radiusOne * radiusOne
。
嘗試更改此:
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
你寫
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.