programing

FLT_MIN이 0인 이유는 무엇입니까?

newsource 2023. 11. 1. 22:23

FLT_MIN이 0인 이유는 무엇입니까?

limits.hfloating이 아닌 점 산술 유형에 대한 한계를 지정합니다.INT_MIN그리고.INT_MAX. 이 값들은 int를 사용하여 나타낼 수 있는 가장 음의 값이자 가장 양의 값입니다.

float.h, 에 대한 정의가 있습니다.FLT_MIN그리고.FLT_MAX. 다음을 수행하는 경우:

NSLog(@"%f %f", FLT_MIN, FLT_MAX);

다음과 같은 출력을 얻을 수 있습니다.

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAX당신이 예상하는 것처럼, 정말 큰 숫자와 같지만, 왜?FLT_MIN정말 큰 음수 대신에 0과 같습니까?

실제로는 0은 아니지만, 를 사용하여 검사하면 0처럼 보일 수 있습니다.printf아니면NSLog을 이용하여%f.
에 따르면float.h(적어도 Mac OS X 10.6.2에서는)FLT_MIN다음과 같이 설명됩니다.

/* Minimum normalized positive floating-point number, b**(emin - 1).  */

그 문장의 긍정적인 것을 주목하세요.FLT_MIN0보다 최소(정규화된) 숫자를 말합니다. (정규화되지 않은 숫자는 훨씬 더 작습니다.)

최소 부동 소수점 숫자(음의 숫자 포함)를 원하는 경우-FLT_MAX.

'%f' 형식은 고정 형식으로 소수점 6자리를 인쇄합니다.FLT_MIN이 훨씬 작기 때문에 고정점에서는 0으로 보입니다.'%e' 또는 '%g' 형식을 사용하면 더 나은 형식의 답변을 얻을 수 있습니다.FLT_MAX와 유사합니다.

#include <float.h>
#include <stdio.h>
int main(void)
{
    printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX);
    printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX);
    return(0);
}


MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000
MIN = 1.175494e-38, MAX = 3.402823e+38

표준 헤더 파일 float.h에서 FLT_MIN 값을 인쇄하려고 할 때마다 0.00000000(출력 화면에서 볼 수 있듯이)을 얻을 수 있습니다.그것은 사실 실수가 아닙니다.형식 지정자 %f 때문에 이 결과가 나타납니다.일반적으로 %f는 소수점 뒤에 6자리를 인쇄하지만 이 경우 부호가 음인 값이 너무 작아서 소수점 뒤에 상당한 양의 숫자를 인쇄해야 합니다.

%.54f(기계 종속)를 사용하여 원하는 결과를 얻었습니다(시스템의 경우 0.000000000000000000000011754943508222875).

//시스템에서 이를 확인합니다.

#include<stdio.h>
#include<float.h>
int main()
{
    printf("Minimum signed float %.55f\n",FLT_MIN);
    printf("Minimum signed float %e\n",FLT_MIN);
    return 0;
}

//출력 :-

// 최소 부호 플로트 0.0000000000000000000000117549435082228750

// 최소 서명 플로트 1.175494e-038

당신이 CHAR_MIN에 대해 0.00000000을 받는 이유와 동일한 포맷의 지정자로 정확한 결과를 얻는 방법은 이제 명확하다고 생각합니다.%e을(를) 사용하면 더 나은 형식의 결과를 얻을 수 있습니다.

왜가.FLT_MIN0과 같습니까?

이것은 0과 같지 않습니다.로 표시됩니다.0.000000사용으로 인하여"%f"소수점 자리 뒤에 6개의 소수점 자리를 인쇄합니다...
FLT_MIN종종 약 1.17549435e-38의 값을 갖습니다.


언급

그 이유에 대해서는 이 질문이 답이 되었지만, 저는 정확한 값을 게시하려고 생각했습니다.FLT_TRUE_MIN, FLT_MIN, FLT_MAX그들의 가장 가까운 곳 뿐만 아니라.float이웃들이웃 :float2진법 32 입니다.

// Approximate value, exact value
Before, FLT_TRUE_MIN, after
 0.00000000e+00 0.0
 1.40129846e-45 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125
 2.80259693e-45 0.0000000000000000000000000000000000000000000028025969286496341418474591665798322625605238837530315435141365677795821653717212029732763767242431640625
Before, FLT_MIN, after
 1.17549421e-38 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875
 1.17549435e-38 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625
 1.17549449e-38 0.00000000000000000000000000000000000001175494490952133940450443629595204006810278684798281709160328881985245648433835441437622648663818836212158203125
Before, FLT_MAX, after
 3.40282326e+38 340282326356119256160033759537265639424.0
 3.40282347e+38 340282346638528859811704183484516925440.0
            inf inf

언급URL : https://stackoverflow.com/questions/2528039/why-is-flt-min-equal-to-zero