【问题标题】:C - floor of double moduls integerC - 双模整数的下限
【发布时间】:2010-08-28 10:25:36
【问题描述】:

我需要执行以下等式 floor(e%100000) 其中 e 是双精度数。我知道 mod 只接受 int 值,我该如何实现同样的结果?

谢谢

【问题讨论】:

    标签: c integer double floor modulus


    【解决方案1】:

    使用fmod() 函数代替%。它接受double 参数,并返回double 结果。

    【讨论】:

      【解决方案2】:

      你为什么不先发言,然后是 mod,即。 floor(e) % 100000?

      也许我误解了您想要实现的目标。你能举一个你期望的输入和输出的例子吗?

      【讨论】:

      • 我正在将具有巨大十进制数(从纬度/经度转换)的以米为单位的东移和北移转换为米,然后对其进行格式化。
      • 这应该或多或少等同于这里的任何其他解决方案。
      • 这仅在floor 的结果适合整数类型时才有效。对于非常大的浮点数,您需要fmod(并且需要希望它以一种对大数字准确的方式实现),但是如果您使用fmod 处理大量数字,您可能会误用浮点数并继续遇到一些令人讨厌的精度损失错误。
      【解决方案3】:

      使用fmod

      【讨论】:

        【解决方案4】:

        你可以用除法来做模的等价物:

        double e = 1289401004400.589201;
        const double divisor = 100000.0;
        double remainder = e - floor(e / divisor) * divisor;
        double result = floor(remainder);
        printf("%f\n", result);
        

        打印出来

        4400.000000

        当然,这比任何内置的模数都要慢得多...

        您也可以只使用 fmod,正如 Anders K. 建议的那样:)

        编辑

        修复了 std::cout (C++) 引用以使用 printf (C)。修复了对输出的更改。现在是纯C。

        【讨论】:

        • -1 for cout 在一个标记为 C 的问题中,甚至在主题中说 C。 C 不是 C++。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多