有没有一种方法可以在评估之前简化分数,以避免被零除?
例:
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。在我的代码中,因子
x1
,x2
和x3
被函数替换。 最佳答案
我已经在评论中陈述了以下内容(听起来有些粗鲁,但这仅仅是因为我认为消除这种误解确实很重要):您不能通过简单地重新排列小数或进行取消来避免被零除。要了解为什么会出现这种情况,请考虑以下示例:
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/