簡體   English   中英

C中的舍入快捷方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM