【问题标题】:invalid operands of types `double' and `int' to binary `operator%'“double”和“int”类型的无效操作数到二进制“operator%”
【发布时间】:2016-06-25 04:35:32
【问题描述】:

编译时将错误无效操作数类型double ' and int '给二进制`operator %'

int x, y, z;
float R;
cout <<"Ejercicio N 2"<<endl;
cout <<"De la expresion: R=(x^3*8MOD2DIVY/(3+x^2))/(8-z/7-y*11MOD2) suministrar el valor de tipo entero X,Y,Z"<<endl;
cout <<"Ingrese el valor de X: "; cin>> x;
cout <<"Ingrese el valor de Y: "; cin>> y;
cout <<"Ingrese el valor de Z: "; cin>> z;
R=(pow(x,3)*8%2/y/(3+pow(x,2)))/(8-z/7-y*11%2);
cout <<"La respuesta es: "<<R<<endl<<endl<<endl;

【问题讨论】:

  • pow(x,3) 是一个浮点值。您不能在结果中使用基于整数的 %。只需执行x * x * x。或者更好的是,将其简化为 0,因为 x * x * x * 8 将始终是偶数,模 2 始终为 0。
  • 在计算 R 时很难看出你在做什么,也许你可以把它分解一下。我的猜测是你可能搞砸了运算符优先级。

标签: c++


【解决方案1】:

pow 函数没有整数结果重载。

因此结果是浮点类型,特别是double 类型,而C++ % 运算符只接受整数参数。

您可以使用fmod 函数计算浮点类型参数的余数,或者您可以计算整数幂,例如作为x*x*x


请注意,如果一个整数结果pow,那么子表达式

pow(x,3)*8%2

... 总是会产生 0。

你知道为什么吗?

【讨论】:

    【解决方案2】:

    如果您将R 的分配缩减为:

    R = pow(x, 3) % 2;
    

    那么更清楚问题是std::pow 返回一个double2 是一个int。使它们具有相同类型的一种可能解决方案是将std::pow 的结果设置为大小写:

    R = (int)pow(x, 3) % 2;
    

    在您的示例中,您将pow(x, 3) 乘以8,但结果仍然是双倍

    【讨论】:

    • 这冒着产生 x^3-1 而不是 x^3 的风险。
    • @Cheersandhth,当然,他可以使用你提到的x * x * x,但我什至不知道他要计算什么
    • 您可以使用static_cast&lt;int&gt;( pow(x, 3) + 0.5 ) 来获得更一般的权力表达。
    • 你可以用很多东西,问题是一个双模整数二
    • 不,这根本不是问题。我用相关信息更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多