由于减法中的浮点误差,在以下情况下是否可以除零?
float x,y,z; ... if (y != 1.0) z = x / (y - 1.0);
换句话说,以下是否更安全?
float divisor = y - 1.0; if (divisor != 0.0) z = x / divisor;
解决方法
这样可以防止你正好除以零,但这并不意味着仍然不会以/ -inf为结果.分母仍然可以足够小,以便答案不能用双重表示,你最终会得到一个inf.例如:
#include <iostream> #include <limits> int main(int argc,char const *argv[]) { double small = std::numeric_limits<double>::epsilon(); double large = std::numeric_limits<double>::max() / small; std::cout << "small: " << small << std::endl; std::cout << "large: " << large << std::endl; return 0; }
在这个程序中,small是非零的,但是它很小,超出double的范围并且是inf.