這是一個Pythagorean triplet的代碼。誰能解釋一下下面的if陳述句的作業原理。
int main()
{
int a, b;
float c。
//使用畢達哥拉斯定理計算另一邊。
/a*a b*b = c*c。
/c=sqrt(a*a b*b)
//最大長度應等于30。
for(a=1; a<=30; a )
{
for(b=1; b<=30; b )
{
c = sqrt(a*a b*b)。
if(c ==(int)c)
{
printf(" (%d, %d, %d)
",a,b,(int)c)。
}
}
}
}
uj5u.com熱心網友回復:
它正在檢查該值是否為積分。'c'是一個浮動數,投擲的時候會去掉任何小數部分。然后,'c'的原始值將被檢查與該轉換的結果。如果它們匹配,那么原來的c就是一個積分值(注意,即使是這樣的轉換,也有很多積分值將無法通過這個測驗,任何大于std::numeric_limits::max()的'c'值)
。uj5u.com熱心網友回復:
這個if陳述句不必作業,因為浮點(float, double, etc)在處理器中的表示與整數(int, char, etc)不同。因此,在一般情況下,這種運算子是錯誤的。
浮點數有時不可能精確表示為整數(尤其是某種計算的結果)(見wiki和這個問題),而整數總是被精確表示。
在你的案例中,使if陳述句正確的一種方法是這樣寫的:
if (fabs(c - roundf(c) ) < eps) {
...
}
其中eps是需要的精度。例如,
float eps = 1e-12; / 10^(-12)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/314503.html
標籤:
