programing

서로 다른 값 유형 간의 0으로 나누기 동작 불일치

mailnote 2023. 5. 21. 11:52
반응형

서로 다른 값 유형 간의 0으로 나누기 동작 불일치

다음 코드와 설명을 고려하십시오.

Console.WriteLine(1 / 0); // will not compile, error: Division by constant zero

int i = 0;
Console.WriteLine(1 / i); // compiles, runs, throws: DivideByZeroException

double d = 0;
Console.WriteLine(1 / d); // compiles, runs, results in: Infinity   

컴파일러가 0 상수에 의한 나눗셈과 런타임에 DivideByZeroException을 적극적으로 확인하는 것을 이해할 수 있지만, 다음과 같습니다.

0으로 나누기에서 더블을 사용하는 것이 예외를 던지기보다 인피니티를 반환하는 이유는 무엇입니까?이것은 의도적인 것입니까 아니면 버그입니까?

재미삼아 VB.NET에서도 이 작업을 수행했으며 "더 일관된" 결과를 얻었습니다.

dim d as double = 0.0
Console.WriteLine(1 / d) ' compiles, runs, results in: Infinity

dim i as Integer = 0
Console.WriteLine(1 / i) '  compiles, runs, results in: Infinity

Console.WriteLine(1 / 0) ' compiles, runs, results in: Infinity

편집:

케켈라의 피드백을 바탕으로 무한대를 이루는 다음을 실행했습니다.

Console.WriteLine(1 / .0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);

은 그 그대로의 처럼 보입니다.0.0사실은 아주 아주 아주 작은 부분으로 인피니티를...

간히말하면단,면하말▁in,double type은 무한대의 값을 정의합니다.int유형은 그렇지 않습니다. 래서에서.double계산 결과는 지정된 유형이 정의되어 있으므로 실제로 표현할 수 있는 값입니다.int경우, 무한대에 대한 값이 없으므로 정확한 결과를 반환할 방법이 없습니다.따라서 예외입니다.

합니다.NET은 약간 다르게 동작합니다. 정수 나눗셈은 자동으로 부동 소수점 값을 생성합니다./교환입니다.이것은 개발자가 다음과 같은 표현을 쓸 수 있도록 하기 위한 것입니다.1 / 2그리고 그것을 평가하게 하라.0.5어떤 사람들은 직관적이라고 생각할 것입니다.C#과 일치하는 동작을 보려면 다음을 시도하십시오.

Console.WriteLine(1 \ 0)

정수 나눗셈 연산자(\,것은 아니다./위의. 합니다.예외(또는 컴파일 오류)가 발생할 것으로 생각합니다.

마찬가지로 다음을 시도합니다.

Dim x As Object = 1 / 0
Console.WriteLine(x.GetType())

는 위의코출력니다됩가드다▁will▁output니를 출력할 것입니다.System.Double.

부정확함에 대한 요점에 대해서, 여기 그것을 바라보는 다른 방법이 있습니다.은 아닙다니은이 double0에 확 정 에 0 대 값 그 없 습 니 다 이 다 한 니 습 은 렇 하 게 그 다 니 없 ▁( 습 다 ▁type 니 값 ▁( 습 it 렇은doubletype은 처음부터 수학적으로 정확한 결과를 제공하기 위한 것이 아닙니다.특정 값은 정확하게 나타낼 수 있습니다.그러나 계산은 정확성을 보장하지 않습니다.)결국, 수학적 표현의 가치는1 / 0정의되지 않았습니다(마지막으로 확인).그렇지만1 / xx가 0에 가까워질수록 무한대에 가까워집니다. 이 가 대부분의 분수를 할 수 ,n / m 정확히 어쨌든, 그것을 다루는 것은 말이 됩니다.x / 0대소문자를 근사하고 접근하는 값을 지정합니다. 다시 말하지만, 무한대는 적어도 정의됩니다.

더블은 부동소수점 숫자이며 정확한 값이 아닙니다. 따라서 컴파일러 관점에서 실제로 구분하는 것은 0에 가깝지만 정확히 0은 아닙니다.

이것은 의도적으로 입니다. 왜냐하면doubletype은 부동 소수점 산술 표준인 IEEE 754를 준수합니다.Double에 대한 설명서를 확인하십시오.의 무한과 이중.의 무한.

이 상수의 값은 양수(또는 음수)를 0으로 나눈 결과입니다.

왜냐하면 "숫자" 부동 소수점은 그런 종류의 것이 아니기 때문입니다.부동 소수점 연산:

  • 연상되지 않음
  • 배포되지 않음
  • 승법 역수가 없을 수 있습니다.

(몇 가지 예는 http://www.cs.uiuc.edu/class/fa07/cs498mjg/notes/floating-point.pdf 참조)

부동소수점은 특정 문제를 해결하기 위한 구조이며, 그렇게 해서는 안 될 때 사용됩니다.저는 그들이 꽤 나쁘다고 생각하지만, 그것은 주관적입니다.

이는 IEEE 표준 부동 소수점 및 이중 정밀 부동 소수점 번호가 지정된 "무한" 값을 가지고 있다는 사실과 관련이 있을 수 있습니다. .NET은 하드웨어 수준에서 이미 존재하는 것을 노출하고 있습니다.

논리적으로 이것이 왜 말이 되는지에 대해서는 케켈라의 대답을 참조하십시오.

언급URL : https://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value-types

반응형