Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在双打上使用模数? 我有一个C++程序(用g++编译)。我试图将两个双精度数作为操作数应用于模函数,但得到以下错误:_C++_Modulo - Fatal编程技术网

Can';t在双打上使用模数? 我有一个C++程序(用g++编译)。我试图将两个双精度数作为操作数应用于模函数,但得到以下错误:

Can';t在双打上使用模数? 我有一个C++程序(用g++编译)。我试图将两个双精度数作为操作数应用于模函数,但得到以下错误:,c++,modulo,C++,Modulo,错误:“double”和“double”类型的操作数对二进制“operator%”无效 代码如下: int main() { double x = 6.3; double y = 2; double z = x % y; } %运算符用于整数。你在找那个 #包括 int main() { 双x=6.3; 双y=2.0; 双z=std::fmod(x,y); } fmod(x,y)是您使用的函数。使用中的fmod()。如果不希望包含C头文件: template<ty

错误:“double”和“double”类型的操作数对二进制“operator%”无效

代码如下:

int main() {
    double x = 6.3;
    double y = 2;
    double z = x % y;
}

%
运算符用于整数。你在找那个

#包括
int main()
{
双x=6.3;
双y=2.0;
双z=std::fmod(x,y);
}
fmod(x,y)
是您使用的函数。

使用
中的
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);
模板
constexpr双dmod(T x,U mod)
{
返回!mod?x:x-mod*静态模式(x/mod);
}
//用法:
双z=dmod(14.3,4);
双z=dmod(14,4.6);
//这也适用于:
双z=dmod(14.7,0.3);
双z=dmod(14.7,0);
双z=dmod(0,0.3f);
double z=dmod(myFirstVariable,someOtherVariable);
您可以实现自己的模函数来实现:

double dmod(double x, double y) {
    return x - (int)(x/y) * y;
}

然后,您可以简单地使用
dmod(6.3,2)
来获取剩余部分,
0.3

正如前面提到的,fmod()提供了必要的函数。正如尚未注意到的,重要的是要认识到
fmod
的第二个操作数中的舍入错误可能会导致意外行为。例如,
fmod(1,0.1)
在数学上应该是零,但实际上几乎是0.1。误差的程度随着商的大小而增加。例如,
fmod(9E14,0.1)
的计算结果约为0.05,从数学角度来看,这是完全错误的。@supercat更多细节将非常棒。我想我对你所说的是真的背后有一个想法,但最好能看到你所说的是真的原因;看看它在幕后是如何工作的会很有趣(我想我理解,但很容易出错)。浮点值表示精确的整数倍或二的幂的分数。例如,整数文本0.1正好是3602879701896397/36028797018963968(后一个值是二的幂)<代码> fMOD(x,0.1)将x除以那个精确的分数,取余数,而不是除以数值“十分之一”。可能的副本:我在C++中为Qt编程,FMOD有一个错误。fmod(角度,360)的结果可以是360(沃特?!)@Paul:那可能不是一个bug。如果
angle
是,比如说
359.9999999
,那么
angle
fmod(angle,360)
都可能显示为
360
。(根据需要添加更多的9。)尝试打印精度为50位的值。@Paul Qt的QString::format将舍入。如果它是如此关键,您将不得不对自己进行取整,或者检查输出是否为“360”,并用您自己的值替换它。@Rohan
main(void)
C++
(这是C遗留)中是不必要的,您的编辑也不会改进任何其他内容。我把它还原了。为什么不包含C头文件?这就是它的目的,仍然不是一个完美的解决方案。x=10.49999999998,y=0.69999999999996返回0.6999999999,而不是0。0@tarpista:这是预期的,带有浮点数。
double dmod(double x, double y) {
    return x - (int)(x/y) * y;
}