【问题标题】:rounding shortcuts in CC中的舍入快捷方式
【发布时间】:2023-12-26 03:09:01
【问题描述】:

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

【问题讨论】:

    标签: c rounding


    【解决方案1】:

    据我所知,除了强制转换为 int 对其他程序员来说可能不是立即显而易见的事实之外,它就像 trunc 一样工作......

    而使用 round 函数,您的意图很明确。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        如果你说floatDelay 是肯定的,两者都可以。

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

        【讨论】:

          【解决方案4】:

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

          这是真的吗?

          如果您确保在截断为 int 之前添加 0.5,
          真的是4.9999的问题。

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

          /约翰

          【讨论】:

          • 如果 4.5000000 + 0.5 的结果最终是 4.9999999,那么它将被截断为 4。在我的特定情况下,我不确定我是否在乎,但它在某些应用程序中可能很重要,我不关心知道如果帕特罗斯没有指出我会想到的。