divide by zero - c programming

[亡魂溺海] 提交于 2019-12-17 20:44:51

问题


I have a question about the next code:

int main { 
double x = 0;
double y = 0/x;

if(y==1) {.....}
....
....
return 0;
}

When I run the code on my computer, I get no runtime error and I see that y = -nan(0x8000000000000). Why it is not a runtime error to divide by zero?

Additionally, when I change the first line to int x = 0; now there is a runtime error. What is the difference?


回答1:


You can't rely on this "working" (i.e. doing the same thing all the time, portably) at all, it's undefined behavior in C for the second case, and also for the first if your implementation doesn't define __STDC_IEC_559__ (this is, I believe, rare these days).

C99, §6.5.5/5

The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined.

The fact you're getting a "Not a Number" in one case and and not in the other is that one is done in floating-point arithmetic, where, on your implementation (conforming to IEEE 754 division by zero semantics), 0/0 gives a NaN.

In the second case, you're using integer arithmetic – undefined behavior, there's no predicting what will happen.




回答2:


The reason you don't get an exception or error is because for a double, infinity and NaN are defined (see IEEE floating point) but when you try the same for integer, you'll get an error because NaN/Infinity aren't defined




回答3:


This is because IEEE 754 standard defines special values for positive and negative infinity along with "not a number" for floating-point values.

Non-floating point types like int do not have those special values defined and so the run-time is being terminated due to un-handled error.

This is not C-specific, you will see a very similar (if not the same) behavior in other languages simply because this functionality is down to hardware.



来源:https://stackoverflow.com/questions/13110825/divide-by-zero-c-programming

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!