除零预防

Vin*_*rta 9 c++

什么是1.#INF为什么以及为什么要投掷 float或double防止因崩溃而被分割?
还有,如何防止0分裂的任何好主意?(像任何宏或模板一样)?

int nQuota = 0;

int nZero = 3 / nQuota; //crash
cout << nZero << endl;

float fZero = 2 / nQuota; //crash
cout << fZero << endl;
Run Code Online (Sandbox Code Playgroud)

如果我改用:

int nZero = 3 / (float)nQuota;
cout << nZero << endl;
//Output = -2147483648

float fZero = 2 / (float)nQuota;
cout << fZero << endl;
//Output = 1.#INF
Run Code Online (Sandbox Code Playgroud)

fre*_*low 13

1.#INF是正无穷大.当你将正浮点数除以零时,你会得到它(如果你将浮点数零本身除以零,那么结果将是"不是数字").

另一方面,如果将整数除以零,程序将崩溃.

float fZero = 2 / nQuota;崩溃的原因是因为运算/符的两个操作数都是整数,所以除法是对整数执行的.然后将结果存储在浮点数中并不重要; C++没有目标类型的概念.

为什么正整数转换为整数是最小的整数,我不知道.

  • C规范似乎没有指定将"NaN"或无限浮点值转换为整数的结果."如果浮动值是有限的或NaN,或者如果浮动值的整数部分超出整数类型的范围,则会引发''无效''浮点异常,并且结果值未指定." (3认同)