[C++] 1. INF00, -1, # IND00 및 -1. # IND 의미?


Answers

C ++의 IEEE 부동 소수점 예외로부터 :

이 페이지는 다음 질문에 답할 것입니다.

  • 내 프로그램이 1. IND 또는 1. INF (Windows) 또는 nan 또는 inf (Linux)를 인쇄했습니다. 어떻게 된 거예요?
  • 숫자가 실제로 NaN 또는 무한대가 아닌 숫자인지 어떻게 알 수 있습니까?
  • NaN 및 무한대의 종류에 대해 런타임에 세부 정보를 어떻게 찾을 수 있습니까?
  • 이 코드의 작동 방식을 보여주는 샘플 코드가 있습니까?
  • 어디에서 더 배울 수 있습니까?

이 질문은 부동 소수점 예외와 관련이 있습니다. 숫자가 예상되는 곳에서 이상한 비 숫자 출력을 얻으면 부동 소수점 산술의 유한 한 한계를 초과했거나 정의되지 않은 결과를 요청했습니다. 일을 간단하게하기 위해 이중 부동 소수점 유형으로 작업하는 데 전념 할 것입니다. float 유형에 대해서도 비슷한 설명이 있습니다.

디버깅 1. # IND, 1. # INF, nan 및 inf

작업이 double에 저장 될 수있는 양수보다 큰 양수를 생성하면 연산은 Windows에서 1을 반환하거나 Linux에서 inf를 반환합니다. 마찬가지로 코드는 -1. # INF 또는 -inf를 반환합니다. 결과가 double에 저장할 수 없을만큼 큰 음수이면. 양수를 0으로 나누면 양의 무한대가 생성되고 음수가 0으로 나누면 음의 무한대가 생성됩니다. 이 페이지 끝의 예제 코드는 무한대를 생성하는 몇 가지 작업을 보여줍니다.

어떤 연산은 음수의 제곱근을 취하는 것과 같이 수학적으로 이해하지 못합니다. (예,이 연산은 복소수의 문맥에서 의미가 있지만 이중은 실수를 나타내므로 결과를 나타내는 이중이 없습니다. 음수의 대수에 대해서도 마찬가지입니다. sqrt (-1.0) 및 log (-1.0)는 "숫자가 아닌"숫자에 대한 일반적인 용어 인 NaN을 반환합니다. Windows는 NaN을 -1로 표시합니다. # IND ( "IND"는 "indeterminate"), Linux는 nan을 표시합니다. NaN을 반환하는 다른 연산에는 0/0, 0 * ∞ 및 ∞ / ∞가 포함됩니다. 예제는 아래 샘플 코드를 참조하십시오.

즉, 1. INF 또는 inf를 얻으면 오버플로 또는 0으로 나누기를 찾습니다. # IND 또는 nan을 얻으면 불법적 인 조작을 찾으십시오. 어쩌면 당신은 단순히 버그가있을 수 있습니다. 더 미묘하고 계산하기 어려운 것이 있다면 오버 플로우, 언더 플로 및 정밀도 손실 방지를 참조하십시오. 이 기사에서는 직접 계산 한 경우 중간 단계 오버플로가 발생하는 컴퓨팅 결과에 대한 트릭을 제공합니다.

Question

float를 사용하는 C 코드를 사용하고 있는데, 1을 얻고 있습니다. # INF00, -1, # IND00 및 -1. # 화면에서 수레를 인쇄하려고 할 때의 IND. 그 값들은 무엇을 의미합니까?

1. INF00은 양의 무한대를 의미하지만, -1은 무엇인가요. # IND00과 -1. # IND? 나 또한 때로는이 값을 보았습니다. 1. 숫자가 아닌 $ NaN. 그러나 이상한 값을 유발하는 원인과 그로 인해 디버깅에 어떤 도움을 줄 수 있습니까?

내가 생각하는 MinGW 를 사용하고 있는데, IEEE 754 표현을 사용하여 부동 소수점 수를 계산합니다.

누군가 그 모든 잘못된 가치와 그 의미를 열거 할 수 있습니까?




.NET 환경에있는 사람들에게 다음은 숫자가 아닌 것을 필터링하는 편리한 방법이 될 수 있습니다 (이 예제는 VB.NET에 있지만 C #에서는 비슷할 것입니다).

If Double.IsNaN(MyVariableName) Then
    MyVariableName = 0 ' Or whatever you want to do here to "correct" the situation
End If

NaN 값이있는 변수를 사용하려고하면 다음 오류가 발생합니다.

값이 Decimal의 경우 너무 크거나 작습니다.




귀하의 질문은 "무엇입니까?"는 이미 위에 응답되었습니다.

지금까지 디버깅 (두 번째 질문)과 특수 입력 값을 확인하려는 라이브러리를 개발할 때 Windows C ++에서 다음과 같은 유용한 기능을 찾을 수 있습니다.

_isnan (), _isfinite () 및 _fpclass ()

Linux / Unix에서는 isnan (), isfinite (), isnormal (), isinf (), fpclassify ()가 유용합니다 (컴파일러 플래그 -lm을 사용하여 libm과 링크해야 할 수도 있음).