서로 다른 값 유형 간의 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
.
부정확함에 대한 요점에 대해서, 여기 그것을 바라보는 다른 방법이 있습니다.은 아닙다니은이 double
0에 확 정 에 0 대 값 그 없 습 니 다 이 다 한 니 습 은 렇 하 게 그 다 니 없 ▁( 습 다 ▁type 니 값 ▁( 습 it 렇은double
type은 처음부터 수학적으로 정확한 결과를 제공하기 위한 것이 아닙니다.특정 값은 정확하게 나타낼 수 있습니다.그러나 계산은 정확성을 보장하지 않습니다.)결국, 수학적 표현의 가치는1 / 0
정의되지 않았습니다(마지막으로 확인).그렇지만1 / x
x가 0에 가까워질수록 무한대에 가까워집니다. 이 가 대부분의 분수를 할 수 ,n / m
정확히 어쨌든, 그것을 다루는 것은 말이 됩니다.x / 0
대소문자를 근사하고 접근하는 값을 지정합니다. 다시 말하지만, 무한대는 적어도 정의됩니다.
더블은 부동소수점 숫자이며 정확한 값이 아닙니다. 따라서 컴파일러 관점에서 실제로 구분하는 것은 0에 가깝지만 정확히 0은 아닙니다.
이것은 의도적으로 입니다. 왜냐하면double
type은 부동 소수점 산술 표준인 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
'programing' 카테고리의 다른 글
Bash 스크립트가 빈 줄로 "명령을 찾을 수 없음"을 인쇄함 (0) | 2023.05.26 |
---|---|
Git 기록에서 중요한 파일 및 해당 커밋 제거 (0) | 2023.05.21 |
Mongoose: 유효성 검사 오류 경로가 필요합니다. (0) | 2023.05.21 |
특정 파일에 대한 변경 사항만 선택하는 방법은 무엇입니까? (0) | 2023.05.21 |
OSX 10.7 Lion으로 업그레이드한 후 Postgresql 복구 (0) | 2023.05.21 |