【问题标题】:How do c++ evaluate the mathematical expressions involving modulus for double data type?c++ 如何评估涉及双精度数据类型模数的数学表达式?
【发布时间】:2013-10-17 08:26:21
【问题描述】:

在下面的代码中,无法计算表达式,因为编译器给了我一个错误

#include <iostream>
int main()
{
    std::cout<< "Welcome\nto\n\nc++!\n";
   // std::cout<< "to c++ ! \n";
   double a=2;
   double b=2;
   double c=3;
   double d=4;
   double e=5;
   double f=6;
   double sum;
  sum=(a*b%c+d/e-f); // error: invalid operand of  types double and double to binary operators%
   std::cout <<"Sum is:" << (float) sum;
    return 0;
}

我知道 fmod(x,y) 函数可以用于双精度,但表达式不会保持不变,有没有其他方法可以做到,或者我需要自己制作一个表达式评估器。如果是这样那怎么办?我是 C++ 新手,请帮忙,为什么编译器不够智能?

【问题讨论】:

  • “不会保持不变”是什么意思?您只需将其重写为使用fmod() 而不是%one is prefix notation, the other is infix.
  • 因为这会改变优先顺序,它会在乘以a*b之前计算mod fmod(b,c)而在BODMAS中我们从左到右移动
  • “重写它以使用fmod()”我的意思是你在保持相同含义的同时重写。你检查了我发布的链接吗? a + b * c + d 可以改写为add(add(a, (mul(b, c)), d)。不要只是将fmod 推入,弄清楚评估的顺序并正确嵌套表达式。

标签: c++ evaluation modulus mathematical-expressions


【解决方案1】:

二元运算符接受两个(= 二元)参数(就像函数一样),因此表达式 5 + 4 可以很容易地用某个函数 add(5, 4) 编写。

注意你得到的错误信息,关键字:“invalid operand binary operator %”

因此,当您想使用 fmod 时,您需要(仔细检查文档)并确定表达式中的左右手操作数是什么。输出取决于您如何编写表达式,这里有两种可能的方式:

fmod(a*b, c) + d/e-f这是正确的order of precedence你写的方式。

但是,如果我们假设您希望模数左边的所有内容都是分子,模数右边的所有内容都是分母,我们可以这样写:

fmod(a*b, c+d/e-f) 这不等于你原来的表达方式。

请注意一些 documentation 表示此函数的参数。

在 C++ 中,有一个小小的期望是程序员拥有智能,而不是编译器。正是这样,程序员才能更明确地控制代码的行为方式。

【讨论】:

  • 暗示 OP 缺乏智慧是没有建设性的。此外,您的代码 (fmod(a*b , c+d / e-f)) 不会以与原始代码 (a*b%c+d/e-f) 相同的方式评估表达式,因为 % 的优先级高于加法。现在谁缺乏智慧?
  • @DanielKO 很难仅根据他们写的方式和内容来判断任何人的智慧,我试图在解释它们时解决误解。我只在这里回答问题,侮辱在哪里,请像我一样明确。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多