0

컴퓨터에서 0으로 나누면 어떻게됩니까?컴퓨터에서 0으로 나누면 어떻게됩니까?

주어진 프로그래밍 언어 (필자와 함께 작업 한 경우)에서 오류가 발생합니다. 하지만 왜? 이 언어로 제작 되었습니까? 금지되어 있습니까? 아니면 컴파일하고 오류가 반환되어야한다는 것을 하드웨어가 알아낼 것입니까?

하드 코드 인 경우에만 언어로 처리 할 수 ​​있습니다. double z = 5.0/0.0;과 같은 라인이 있습니다. 함수 호출이고, 외부에서 devisor가 주어지면, 언어는 이것이 0으로 나누는 것 (적어도 컴파일 타임)을 알지조차 모릅니다.

제수가 0.0 불려
double divideByZero(double divisor){ 
    return 5.0/divisor; 
} 

.

업데이트 : 는 의견/답변에 따르면 그것은 당신이 int 0 또는 double 0.0에 의해 분할 여부 차이가 있습니다. 나는 그 사실을 몰랐다. 이것은 그 자체로 흥미 롭습니다. 그리고 두 경우 모두에 관심이 있습니다.

또한 하나의 대답은 CPU에서 오류가 발생한다는 것입니다. 자, 어떻게이 일이 끝나나요? 또한 소프트웨어 (CPU에서 이해가되지 않는다) 또는 이것을 인식하는 회로가 있습니까? 나는 이것이 산술 논리 단위 (ALU)에서 일어난다 고 생각한다.

+0

해석 된 언어 나 런타임이 다른 언어에서는 "언어"가 제수가 무엇인지 잘 알 수 있습니다. 컴파일 된 언어에서 이러한 체크는 바이너리로 컴파일 될 수 있습니다. "언어"가 알 수없는 유일한 시간은 그러한 검사없이 기계 코드로 직접 컴파일되는 경우입니다. – deceze

답변

3

CPU에서 정수를 0으로 나누면 인터럽트가 발생합니다 .¹ 프로그래밍 언어 구현은 예외를 throw하거나 언어에 다른 오류 처리 메커니즘을 사용하여 해당 인터럽트를 처리 할 수 ​​있습니다.

부동 소수점 수를 0으로 나눌 때 결과는 무한대, NaN 또는 음수 무한대 (특수 부동 소수점 값)입니다. 이는 모든 현대 CPU가 준수 할 IEEE 부동 소수점 표준에 의해 요구됩니다. 프로그래밍 언어는 일반적으로 잘 수행됩니다. 프로그래밍 언어가 대신 오류로 처리하기를 원한다면 모든 부동 소수점 연산 후 NaN 또는 무한 결과를 확인하고이 경우 오류가 발생할 수 있습니다. 그러나, 내가 말한대로, 그것은 일반적으로 행해지 지 않습니다.


¹ 적어도 x86 이상. 하지만 대부분의 다른 아키텍처에서도 마찬가지라고 생각합니다.

+0

질문의 코드는 정수가 아닌 부동 소수점 숫자를 보여줍니다. – svick

+0

@svick 부동 소수점 숫자에 대한 상황을 내 대답에 추가했지만 실수로 실수로 OP를 사용했다고 가정합니다 (대부분의 언어에서 0으로 나누면 실수 만 부동 소수점에 맞지 않음) . – sepp2k