假設我有一些代碼,如:我可以信任ceil()的結果的實數轉換嗎?
float a, b = ...; // both positive
int s1 = ceil(sqrt(a/b));
int s2 = ceil(sqrt(a/b)) + 0.1;
有沒有可能是s1 != s2
?我的關注是當a/b
是一個完美的廣場。例如,可能是a=100.0
和b=4.0
,那麼ceil
的輸出應該是5.00000
,但是如果代之以是4.99999
?
相似問題:有沒有機會100.0/4.0
評估說5.00001
,然後ceil
將它舍入到6.00000
?
我寧願這樣做在整數數學,但sqrt
有點螺絲計劃。
編輯:關於如何更好地實現這一點的建議,也將不勝感激!該a
和b
值是整數值,所以實際的代碼更像是:ceil(sqrt(float(a)/b))
編輯:基於levis501的回答,我想我會做到這一點:
float a, b = ...; // both positive
int s = sqrt(a/b);
while (s*s*b < a) ++s;
謝謝大家!
這些計算是什麼?例如,你可以將'sqrt(x)
GManNickG
不幸的是,即使「a/b」是一個完美的正方形,'s1!= s2'也是很可能的。浮點運算是非常不準確的,所以你獲得'5.00000'(或者任何你想要的數字)的機會都很渺茫。 – ssube
@peachykeen即使我們正在處理整數數字? '5.0'可以完美地表示爲一個浮點數,'100.0'和'20.0'也是如此。 – glglgl