有没有一种方法可以在评估之前简化分数,以避免被零除?

例:

double x1 = 2;
double x2 = 2;
double x3 = 2;

double r1 = (x1-x2)/(x1-x2-x3);
cout << r1 << endl;
x3 = 0;
r1 = (x1-x2)/(x1-x2-x3);
cout << r1 << endl;


将返回:

-0
-nan


是否有可能使编译器在编译时简化第二个表达式,从而避免被零除?特别是,如果x3等于0,我希望(x1-x2)/(x1-x2-x3)简化为1。

在我的代码中,因子x1x2x3被函数替换。

最佳答案

我已经在评论中陈述了以下内容(听起来有些粗鲁,但这仅仅是因为我认为消除这种误解确实很重要):您不能通过简单地重新排列小数或进行取消来避免被零除。要了解为什么会出现这种情况,请考虑以下示例:

 x/y


这不一样

 (0*x) / (0*y)


因为这会大大改变分数的值。一般来说

 x/y = (a*x) / (a*y)


仅当a不为0时为true。另一种查看方式是考虑方程式和可能的转换。考虑

a = b


这绝对不一样

0*a = 0*b




(a = b)  is equivalent to (a*x = b*x)


仅在x不为0时成立。

如果要避免被零除,唯一的方法是检查除数是否为0并以某种方式处理这种情况。您无法通过抵消0来避免被零除,因为这将改变分数的值。

关于c++ - 在编译时简化分数以避免被零除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36885533/

10-10 23:37