programing

ANSI C에서 NaN, -Infinity 및 +Infinity를 생성하는 방법

goodcopy 2022. 8. 2. 23:49
반응형

ANSI C에서 NaN, -Infinity 및 +Infinity를 생성하는 방법

ANSI C89(C++가 아님)를 사용하고 있으며,NaN,-Infinity그리고.+Infinity.

표준적인 방법(표준 매크로 등)이 있습니까?또는 이러한 수치를 생성하는 플랫폼과 컴파일러의 독립된 방법이 있습니까?

float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN?

C99에는 있지만 이전 표준 AFAIK에는 없습니다.

C99에서는,NAN그리고.INFINITY매크로를 선택합니다.

"수학" 섹션 (제7.12)에서

매크로 INFINITY는 사용 가능한 경우 양의 또는 부호 없는 불일치를 나타내는 유형 부동의 상수 표현으로 확장됩니다.

ANSI C89를 계속 사용한다면 운이 없을 것입니다.C-FAQ 14.9를 참조하십시오.

표준인지 휴대용인지 모르겠지만, 여기서부터 시작합시다.

jcomeau@intrepid:/tmp$ cat test.c; make test; ./test
#include <stdio.h>
int main() {
 printf("%f\n", 1.0 / 0);
 printf("%f\n", -1.0 / 0);
 printf("%f\n", 0.0 / 0);
 return 0;
}
cc     test.c   -o test
test.c: In function ‘main’:
test.c:3: warning: division by zero
test.c:4: warning: division by zero
test.c:5: warning: division by zero
inf
-inf
-nan

이상하게도 이런 순진한 방법으로는 긍정적인 NaN을 얻을 수 없다.


Also see this: http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html

오래된 컴파일러를 사용하는 경우INFINITY존재하지 않습니다.매크로도 사용할 수 있습니다.HUGE_VAL대신, 에 정의되어 있습니다.<math.h>도서관.

HUGE_VAL는 C89/C90 표준(ISO/IEC 9899:1990)으로 제공되어야 합니다.

참고 자료: http://en.cppreference.com/w/c/numeric/math/HUGE_VAL

무한대와 음의 무한대를 만드는 실제 방법이 있다.C89가 따르는 IEEE 754 표준에 따라 무한대는 가수(처음 23비트)의 모든 0과 지수(다음 8비트)의 모든 0을 포함하는 부동소수점 번호로 정의됩니다. nan는 지수 안에 있는 모든 1과 가수 안에 있는 모든 0을 제외한 모든 숫자로 정의됩니다(무한이기 때문에).어려운 부분은 이 번호를 생성하는 것이지만 다음 코드를 사용하여 이 번호를 생성할 수 있습니다.

unsigned int p = 0x7F800000; // 0xFF << 23
unsigned int n = 0xFF800000; // 0xFF8 << 20
unsigned int pnan = 0x7F800001; // or anything above this up to 0x7FFFFFFF
unsigned int nnan = 0xFF800001; // or anything above this up to 0xFFFFFFFF

float positiveInfinity = *(float *)&p;
float negativeInfinity = *(float *)&n;
float positiveNaN = *(float *)&pnan;
float negativeNaN = *(float *)&nnan;

하지만, 단순히 캐스팅하는 것만으로unsigned에 대해서float컴파일러가 생성될 수 있습니다.float같은 가치의.따라서 컴파일러가 메모리를 플로트로 읽도록 하면 원하는 결과를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/6235847/how-to-generate-nan-infinity-and-infinity-in-ansi-c

반응형