在許多編程語言中,都有一個名爲floor的函數,它採用一個浮點參數(double或single),並返回不大於參數的最大整數。現在我有一個問題:通過調用floor(a/b)來獲取不大於a/b的最大整數是否安全?我認爲浮點計算可能是不精確的。所以,例如,a/b的確切值可能是2.999999998,但它可能被計算爲3.00000000,然後floor(a/b)得到3,這是不正確的。使用地板(a/b)安全嗎?
回答
是的,如果使用IEEE754 binary64格式(即在大多數系統上是典型的C double
)。一個示例是當a = 0.9
(其中,因爲0.9不能由格式來表示,實際上是0.90000000000000002220446049250313080847263336181640625)和b = 0.1
(實際上0.1000000000000000055511151231257827021181583404541015625)然後a/b
真值實際上是
8.999999999999999722444243843710880301531638075180891038116311176859261171872 ...
然而,這將獲得四舍五入爲9.0
,因爲它比以前的浮點數
8.9999999999999982236431605997495353221893310546875
接近所以floor(a/b)
也將是9.0
。
你從哪裏得到那個'8.9999999999999997224442438437108803015316380751808910 ...'會被舍入到9.0? –
它是安全的,如果a
和b
爲整數(小於功率(2,尾數+ 2)的尺寸),或者如果a
和b
是「精確」來表示。
START_UPDATE
的問題可以重新進入:是有可能有a/b = n
與a < n*b
?
的說法是相當複雜的,但答案是否定的這個問題:
如果a < n*b
然後a <= n*b - eps(n*b)/2
。
最壞的情況是,當eps(n*b)/2
比2的冪接近,但少,但即使在這種最壞的情況下,你有
a < n*b - n*b*eps(1.0)/4
所以
a/b exactly evaluated < n - n*eps(1.0)/4
a/b exactly evaluated < n - eps(n)/4
和輪最接近的偶數模式確保:
a/b in floating-point < n
END_UPDATE
現在假設的a/b
準確值是一個整數n
用下來,近似a
和上近似b
。然後a/b
可能會在最後一個位置超過1/2單位,因此小於n
。因此,a/b = n
的確切值,而floor(a/b) = n-1
。
以下C++代碼返回floor((i/1000)/0.001)
與i
不同的例外。第一個是0.043/0.001
。
#include <iostream>
#include <cmath>
int main() {
double x, y;
for (int i = 0; i < 1000; ++ i) {
x = i/1000.0;
y = 0.001;
if (floor(x/y) != (double) i)
std::cout << i << ' ' << floor(x/y) << '\n';
}
std::cout.flush();
}
- 1. Malloc可以安全地使用nogil嗎?
- 2. XPath:如何使用AB-AB搜索AB?AB或AB?-AB
- 3. 安全地從ARM模板
- 4. 使用javascript sha1安全嗎?
- 5. 使用SET ROWCOUNT安全嗎?
- 6. 要使用shared_ptr,安全嗎?
- 7. 使用代理安全嗎?
- 8. 使用MD5不安全嗎?
- 9. 使用Capistrano安全嗎?
- 10. 使用Parse.Object.attributes安全嗎?
- 11. 使用window.screen安全嗎?
- 12. 使用ComputedProperty安全嗎?
- 13. 使用RESTful API - 安全嗎?
- 14. 使用cstdarg安全嗎?
- 15. sync.WaitGroup可以安全地重用嗎?
- 16. 可以安全地應用補丁嗎?
- 17. 用戶代碼可以安全地使用struct padding嗎?
- 18. 在Django模板中安全地使用JSON和JSON中的html
- 19. 安全地修改Magento模板
- 20. 如何安全地統計會話:Session_Start/End in Global.Asax安全/足夠安全嗎?
- 21. 使用用戶的RegEx安全嗎?
- 22. 使用AngularJS的安全管理面板
- 23. MonoTouch可以安全地與Core Audio一起使用嗎?
- 24. Task.Delay可以安全地在ASP.NET中使用嗎?
- 25. 我可以安全地使用utf8mb4列的utf8連接嗎?
- 26. 當SynchronizationContext.Current爲空時,我可以安全地使用Task.Wait嗎?
- 27. Fopen可以安全地在公共軟件中使用嗎?
- 28. Typhoeus可以安全地使用activerecord嗎? resque?
- 29. -fomit-frame-pointer,它可以安全地使用它嗎?
- 30. 現在我們可以使用diagnostics.wadcfgx安全地刪除diagnostics.wadcfg嗎?
是'a'和'b'整數,還是一般浮動? –
如果'a'和'b'是在合理範圍內的整數,並且我們可以假設IEEE 754語義,那麼是的,這是安全的(大概是因爲如果除法結果是一個不太大的整數,那麼'a/b '將被無誤地計算出來,而如果它不是一個整數並且'a'和'b'不是太大,那麼除法結果不能太接近整數。如果這是你感興趣的情況,請說出來,以便有人可以構建一個適當的答案。 –
我的意思是,a和b是一般的浮點數,但它們是完全表示的。如果難以回答這個問題,回答關於整數也是可以的。 – zhoudu