[英]rounding shortcuts in C
我正在C語言中實現表示以下內容的偽代碼:
delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay
floatDelay將始終為正。 使用math.h中的round函數是否有優勢:
#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));
或者我可以使用:
delay=(int)(64*(floatDelay - intDelay) + 0.5))
除了對其他程序員可能無法立即將其強制轉換為int的事實這一事實外,我沒有任何其他優點。
而使用舍入功能,您的意圖很明確。
只要您說floatDelay
為正,就可以。
考慮到round()
很可能實現為編譯器內在函數,因此如果不進行基准測試就很難說出哪一個比另一種快一些。 任何速度差異都非常不重要,因此請使用您認為更清晰的方式。
處理浮點數時,應始終使用適當的數學庫。 浮點數可能只是非常接近實際值,這可能會引起怪異。
例如,5f可能近似為4.9999999 ...,如果您嘗試直接將其強制轉換為int,它將被截斷為4。
要深入了解原因,您應該在Wikipedia上查找浮點數。 簡而言之,它不是像整數一樣將數字存儲為一系列連續的位,而是將其存儲為兩部分。 有一個“分數”和一個指數,其中浮點數的最終值為分數*(基數^指數)。
我發現“ 在c ++中截斷十進制值 ”提供了有關浮點數的有用討論。
特別是格雷格·休吉爾(Greg Hewgill)提供了以下鏈接: 每個計算機科學家都應該知道的有關浮點運算的知識 ,大衛·戈德伯格(David Goldberg)
例如,5f可能近似為4.9999999 ...,如果您嘗試直接將其強制轉換為int,它將被截斷為4。
這是真的嗎?
如果您確定要在截斷為int之前添加0.5,
確實是4.9999的問題。
我的意思是:4.9999 + 0.5 = 5.4999-> 5
/約翰
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.