【发布时间】:2010-08-28 10:25:36
【问题描述】:
我需要执行以下等式 floor(e%100000) 其中 e 是双精度数。我知道 mod 只接受 int 值,我该如何实现同样的结果?
谢谢
【问题讨论】:
标签: c integer double floor modulus
我需要执行以下等式 floor(e%100000) 其中 e 是双精度数。我知道 mod 只接受 int 值,我该如何实现同样的结果?
谢谢
【问题讨论】:
标签: c integer double floor modulus
使用fmod() 函数代替%。它接受double 参数,并返回double 结果。
【讨论】:
你为什么不先发言,然后是 mod,即。 floor(e) % 100000?
也许我误解了您想要实现的目标。你能举一个你期望的输入和输出的例子吗?
【讨论】:
floor 的结果适合整数类型时才有效。对于非常大的浮点数,您需要fmod(并且需要希望它以一种对大数字准确的方式实现),但是如果您使用fmod 处理大量数字,您可能会误用浮点数并继续遇到一些令人讨厌的精度损失错误。
使用fmod
【讨论】:
你可以用除法来做模的等价物:
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。
【讨论】:
cout 在一个标记为 C 的问题中,甚至在主题中说 C。 C 不是 C++。