naN 플로트를 c에서 생성하는 방법은?
float f = (float)'a';
if(f < 0){
}
else if(f == 0){
}
else if(f > 0){
}
else{
printf("NaN\n");
}
f보다 더 크진 않을 것입니다/더 크진 않을 것이다/더 작지 않을 것입니다0NaN.
하지만 어떻게 그런 것을 만들어 낼 수 있을까요?f처음에?
를 만들기 위해 다양한 했습니다.NaN,하지만 아무 일도..
숫자, 를 하면 하면 를 ,0.0 / 0.0한가e다"n"n;t가s0'oey""at 결과는 다음과 같습니다.NaN.
C은 C 은 합니다 합니다를 합니다.-nan:
#include <stdio.h>
int main()
{
float x = 0.0 / 0.0;
printf("%f\n", x);
return 0;
}
ㅇNaN컴퓨터에 따르면, 두 개의 "잘못된" 숫자는 "신호"와 "조용한" NaN을 위해 예약된 것처럼 보입니다. (양과 음의 무한대를 위해 예약된 두 개의 잘못된 숫자와 유사합니다.)위키백과 항목에는 NaN이 IEE 부동 소수점 번호로 표현되는 방법에 대한 자세한 내용이 나와 있습니다.
나노를 만드는 데는 몇 가지 방법이 있습니다.
( 읽기) ()ieee754비트를 올바르게 설정합니다.)
2) ① 는 macro GCC를 노출합니다.NAN
나노를 확인하는 일반적인 방법은if (f == f)값에 함) (nan의우야함)함야우 )
nan의 경우 플로트 표현의 지수 비트를 모두 1로 설정해야 합니다(플로트는 부호 있는 비트, 지수 비트 집합 및 가수 비트 집합으로 구성됨).
사용하실 수 있습니다.NANmacro, macro 중 는히나히o는foeynan/nanf입니다.nan에는다을다는os에을aanee
값을 하려면 nan을지면을할수다고다n수을eo할고fun을,u지keh하려면isnan(): . 은 입니다 입니다.
#include <stdio.h>
#include <math.h>
int main(void) {
float a = NAN;//using the macro in math.h
float f = nanf("");//using the function version
double d = nan("");//same as above but for doubles!
printf("a = %f\nf = %f\nd = %f\n",a,f,d);
if(isnan(a))
puts("a is a not a number!(NAN)\n");
return 0;
}
위의 코드 조각을 실행하면 다음과 같은 출력을 얻을 수 있습니다.
a = nan
f = nan
d = nan
a is a not a number!(NAN)
코드를 직접 실행해보세요. http://ideone.com/WWZBl8
자세한 정보 읽기: http://www.cplusplus.com/reference/cmath/NAN/
GNU GNU GCC math.h는 변수를 명시적으로 무한대 또는 NaN으로 설정할 수 있는 매크로를 정의합니다.이것은 C99의 일부분이므로 다른 C99 호환 컴파일러와 함께 다음 매크로를 사용할 수 있습니다.
— Macro: float INFINITY 양의 무한대를 나타내는 식입니다.1.0 / 0.0과 같은 수학 연산에 의해 생성된 값과 같습니다. -INFINITY는 음의 무한을 나타냅니다.
부동 소수점 값을 이 매크로와 비교하여 무한대인지 여부를 검정할 수 있습니다.그러나 이 방법은 권장되지 않으며 대신 isfinite 매크로를 사용해야 합니다.부동 소수점 클래스를 참조하십시오.
이 매크로는 ISO C99 표준에 도입되었습니다.
— Macro: float NAN "숫자가 아닌" 값을 나타내는 식입니다.이 매크로는 GNU 확장 프로그램으로, "not a number" 값을 지원하는 컴퓨터, 즉 IEEE 부동 소수점을 지원하는 모든 컴퓨터에서만 사용할 수 있습니다.
'#ifdef NAN'을 사용하여 기계가 NaN을 지원하는지 테스트할 수 있습니다. (물론 _GNU_SOURES를 정의하는 등 GNU 확장자가 보이도록 정렬한 다음 math.h를 포함해야 합니다.)
자세한 정보는 여기에서 확인하실 수 있습니다: http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html
C, 의 C 을 할 을 수행할 수 있습니다.#include <math.h>를 합니다.NAN매크로(정의된 경우).예를 들어, GCC는 내장된 다음과 같이 구현됩니다.(__builtin_nanf ("")).
C C 의 서 서 의 )<math.h>헤더를 사용할 수 없을 수도 있음) 또는 다음과 같은 경우NAN될 수 할 수 ). (NaN할수음는로할다수점과 NaN동어은을다지이수ohsas-aen로agnhttdn(는nnen(y어다는지sthe점a과,and',음0.0 / 0.0몇 수 . 하지만 몇 가지 문제가 있을 수 있습니다.
첫째, 그러한 작업은 또한 일부 C 구현에서 가능한 트랩과 함께 예외를 생성합니다.컴파일 시 다음을 사용하여 계산할 수 있습니다.
static double my_nan = 0.0 / 0.0;
또 C 일부 버전)에서 Microsoft Visual C++(최소한 일부 버전)을 평가하려고 입니다.0.0 / 0.0컴파일 시 (이 표현식이 코드에서 임의의 위치에 있는 경우에도), 그리고 그것의 유효성에 대해 불평합니다.따라서, 여기서의 해결책은 반대입니다. 컴파일러가 다음을 수행하여 컴파일 시간에 이를 평가하지 않도록 해야 합니다.
static double zero = 0.0;
그 다음에 사용합니다.zero / zero상충되기 에, 은 되기 에 를 할 로 할 를 로 #if...) 특정 매크로에 적용됩니다.
NaN 인코딩을 기반으로 솔루션을 선택할 수도 있지만 휴대성 문제도 있습니다.첫째, IEEE 754 표준은 NaN의 부호화, 특히 조용한 NaN과 시그널링 NaN을 구별하는 방법을 완전히 정의하지 않습니다.(그리고 하드웨어는 실제로 다릅니다.) 시그널링 NaN은 정의되지 않은 동작을 산출합니다.또한, IEEE 754 표준은 비트열이 메모리에서 표현되는 방식을 정의하지 않습니다. 즉, 엔디안니스(endianness)가 검출될 필요가 있을 수 있습니다.되면,면의,는의 또는 .unsigned char포인터 캐스트를 사용하면 부동 소수점 유형을 얻을 수 있습니다.포인터가 주소에 캐스트된 정수를 사용하여 유형 펀닝을 수행하지 마십시오. 그러면 별칭 규칙이 위반됩니다.
A -nan아래와 같이 플로트 변수의 32비트를 모두 1로 설정하여 생성할 수도 있습니다.
float nan_val = 0xffffffff;
가 가 할 과 인지 비교할 수 .-nan자신과의 비교 실패 여부를 확인하여 명시적으로 확인합니다.
if (nan_val != nan_val) {
// executes iff nan_val is -nan
}
이 비교 방법은 IEEE 플로트를 사용하는 컴파일러에서 작동해야 합니다.
이것은 상수에서도 작동합니다(0/0은 vs에서 컴파일러 오류를 제공합니다).
const unsigned maxU = ~0;
const float qNan = *((float*)&maxU);
다음의 C 프로그램은 NaN을 생성합니다.두 번째 진술은 NaN으로 귀결됩니다.
#include <stdio.h>
#include <tchar.h>
#include "math.h"
int _tmain(int argc, _TCHAR* argv[])
{
double dSQRTValue = sqrt( -1.00 );
double dResult = -dSQRTValue; // This statement will result in a NaN.
printf( "\n %lf", dResult );
return 0;
}
프로그램의 출력은 다음과 같습니다.
1.#QNAN0
nan은 @Dan Cecile OR sqrt(-1)에서 말하는 0.0/0.0과 같은 값을 프로그램할 때 생성됩니다.
언급URL : https://stackoverflow.com/questions/7212356/how-to-produce-a-nan-float-in-c
'programing' 카테고리의 다른 글
| jQuery mobile $문서.즉시 동등한 (0) | 2023.09.18 |
|---|---|
| R 일 년으로 여러 열을 퍼 나르고 있음 (0) | 2023.09.18 |
| MySQL 각각 여러 행으로 여러 테이블 결합 (0) | 2023.09.13 |
| 앱(Layout) XML 변수에서 매니페스트 버전 번호를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.13 |
| Spring Boot 응용 프로그램을 시작할 때 RMI TCP 연결 오류가 발생했습니다. (0) | 2023.09.13 |