2

我正在使用 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))
4

4 回答 4

3

我所知道的没有任何优点,除了强制转换为 int 对其他程序员来说可能不会立即显而易见,它就像一个 trunc...

而使用圆形功能,您的意图很明确。

于 2009-01-07T17:11:28.830 回答
2

两者都可以,只要你说floatDelay的是肯定的。

一个可能比另一个稍微快一点,尽管如果没有基准测试很难判断哪个,因为它round()很可能作为编译器内在函数实现。更有可能的是,任何速度差异都压倒性地不重要,因此请使用您认为更清晰的任何一个。

于 2009-01-07T17:12:50.963 回答
2

在处理浮点数时,您应该始终使用适当的数学库。浮点数可能只是实际值的非常接近的近似值,这可能会导致奇怪。

例如,5f 可能近似为 4.9999999...,如果您尝试直接转换为 int,它将被截断为 4。

要深入了解原因,您应该在 wikipedia 上查找浮点数。但简而言之,它不是将数字存储为像 int 那样的一系列位,而是存储在两个部分中。有一个“分数”和一个指数,其中浮点数的最终值为分数 *(基数 ^ 指数)。

于 2009-01-07T18:24:25.000 回答
0

例如,5f 可能近似为 4.9999999...,如果您尝试直接转换为 int,它将被截断为 4。

这是真的吗?

如果您确保在截断为 int 之前添加 0.5,
那么 4.9999 确实是个问题。

我的意思是:4.9999+0.5=5.4999 -> 5

/约翰

于 2009-01-08T20:41:06.627 回答