我有一个用g++编译的C++程序。我尝试将两个double作为操作数应用于模运算,但是我遇到了以下错误:
error: invalid operands of types 'double' and 'double' to binary 'operator%'
这是代码:
int main() {
double x = 6.3;
double y = 2;
double z = x % y;
}
%
运算符用于整数。你需要使用fmod()
函数。
#include <cmath>
int main()
{
double x = 6.3;
double y = 2.0;
double z = std::fmod(x,y);
}
angle
是,比如说,359.9999999
,那么 angle
和 fmod(angle, 360)
都很可能被显示为 360
。(根据需要添加更多的 9)。尝试以 50 位有效数字打印这些值。 - Keith Thompsonmain(void)
在C++
中不是必需的(它是C的遗留),而且您的编辑也没有改进任何其他内容。我已将其恢复。 - Ayxan Haqverdilistd::fmod(-1.0, 2 * M_PI)
返回 -1.0
,我期望的是大约 5.28
。 - Donald Duckfmod(x, y)
是你需要使用的函数。
您可以实现自己的模运算函数来完成此操作:
double dmod(double x, double y) {
return x - (int)(x/y) * y;
}
那么您可以简单地使用dmod(6.3, 2)
来获取余数,即0.3
。
<cmath>
中的 fmod()
。如果您不想包含 C 头文件:template<typename T, typename U>
constexpr double dmod (T x, U mod)
{
return !mod ? x : x - mod * static_cast<long long>(x / mod);
}
//Usage:
double z = dmod<double, unsigned int>(14.3, 4);
double z = dmod<long, float>(14, 4.6);
//This also works:
double z = dmod(14.7, 0.3);
double z = dmod(14.7, 0);
double z = dmod(0, 0.3f);
double z = dmod(myFirstVariable, someOtherVariable);
这里是一个可以适用于正负数的函数:
#include <cmath>
inline double nmod(double x, double y) {
return std::fmod(std::fmod(x, y) + y, y);
}
如果x
是负数或正数,它将始终返回一个正数。
请注意,如果y
是负数,则返回值将为负数。如果您需要一个无论如何都返回正数的函数,则需要在y
上使用std::fabs()
,即:
inline double nmod2(double x, double y) {
return std::fmod(std::fmod(x, y) + std::fabs(y), y);
}
fmod
的第二个操作数中的舍入误差可能会导致意外行为。例如,fmod(1, 0.1)
在数学上应该是零,但实际上将近等于0.1。误差的程度随商的大小而增加。例如,fmod(9E14, 0.1)
的计算结果约为0.05,从数学上讲完全错误。 - supercatfmod(x,0.1)
将通过该精确分数对x进行除法并取余数,而不是除以数字值“十分之一”。 - supercat