我在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问题。

我的意思是: 4.9999 + 0.5 = 5.4999 - &gt; 5

/约翰

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top