题
我在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))
解决方案
处理浮点数时,应始终使用适当的数学库。浮点数可能只是实际值的非常接近的近似值,这可能会导致奇怪。
例如,5f可能接近4.9999999 ...如果你试图直接转换为int,它将被截断为4。
要深入了解原因,您应该在维基百科上查找浮点数。但简而言之,它不是将数字存储为像int这样的直接系列,而是存储在两个部分中。有一个“分数”和一个指数,其中浮点数的最终值是分数*(基数^指数)。
其他提示
我所知道的没有任何优点,除了对其他程序员来说,对int来说可能不会立即显示强制转换的事实,它就像一个截断...
而使用圆函数,你的意图很明确。
如果你说 floatDelay
是肯定的,那么就可以了。
有可能一个比另一个略快,但如果没有基准测试就很难分辨哪个,因为 round()
很可能是作为编译器内在实现的。更有可能的是,任何速度差异都非常不重要,所以请使用您认为更清晰的速度。
我发现“在c ++中截断十进制值”提供了对浮点数的有用讨论。
特别是Greg Hewgill提供了以下链接:每个计算机科学家应该知道的内容浮动算法由David Goldberg提供
例如,5f可能接近4.9999999 ...... 如果你试图直接转换为int,它将被截断为4。
这是真的吗?
如果确保在截断为int之前添加0.5,
真的是4.9999问题。
/约翰
不隶属于 StackOverflow