2011-09-26 50 views
1

在另一個不相關的Internet論壇中,有人問到如何檢查給定數字的平方根是否爲整數。現在本身就是一個微不足道的家庭作業問題,但我開始懷疑在任何情況下,天真的做法是否正確。也就是說,在僞代碼:由於浮點舍入錯誤,非整數的平方根可以成爲整數嗎?

declare x, y as double 
input x 
y = sqrt(x) 
if round(y) = y then 
    output "Is integer" 
else 
    output "Isn't integer" 

是否有可能進入這樣一個x,這x本身就是一個整數(或整數這是不是另一個整數的平方),但sqrt(x)和整數,因爲浮點錯誤?

回答

8

是:當x位於Machine epsilon的邊緣時。 考慮x = 1.00 ... 0001,它仍然以二進制形式表示,與1.0不同。這個數字的平方根將給出1.0,產生虛假的和。

+0

是的,當然!我爲什麼沒有想到它? :) –

4

1.0以上的下一個可表示的浮點數的平方根(C中的nextafter(1.0))可能合理地評估爲1.0。

0

首先,如果數字太大以致精度不能延伸到小數點,那麼您只會得到整數,但它們不正確,所以我想你不關心那個案件。

關於確切的結果:如果你有IEE754浮點數,這應該相當容易測試。只需取一個完美的整數平方的雙精度,將其二進制表示遞增或遞減一位,然後檢查平方根是否爲精確整數。我相信標準浮點運算需要精確到0.5個單位,所以可能整數實際上是最接近正確的可表示的平方根。

0

當然:

double d = Math.Sqrt(4.000000000000001); 
Console.WriteLine(d == 4); 
Console.WriteLine(d == 2); 

這導致(C#)

False 
True 
0

飼養x作爲浮法等當然工作的1個+小量意願。但是對於一個非方形整數,如果整數足夠大,它也可以工作。

例如(C#)

ulong i = ulong.MaxValue; // 2^64-1, a non square integer. 
double s = Math.Sqrt(i); // Very nearly 2^32 
bool same = Math.Round(s) == s; // true, s is close enough to 2^32.