인프런 커뮤니티 질문&답변

ILLIP님의 프로필 이미지
ILLIP

작성한 질문수

홍정모의 따라하며 배우는 C언어

3.12강 부동소수점 한계에서 왜 %e를 쓰나요?

작성

·

282

·

수정됨

0

3.12강 강의 후반부에서 underflow를 설명하실 때 min값을 출력하려고 할 때 max를 출력할때와 다르게(max를 출력할 땐 printf에서 %f를 쓰셨는데) %e로 지정을 하셨습니다.

제가 %f로 출력할 땐 콘솔창에 값이 제대로 표현되지 않았는데 %e로 했을땐 제대로 표현되는 것을 볼 수 있었습니다. 혹시 이유를 알 수 있을까요?

제가 생각한 이유는 min값은 너무 작은 값이라서 f형으로 표현하기엔 너무 작아서 지수식 표현법을 사용해야 정밀도를 잃지 않고 표현한 것이라 생각이 드는데 맞을까요?

 

//underflow

float min = 1.401298464e-45F;

printf("%e\n", min); // %f가 아니라 %e로 표현한다.

min = min / 100.0f;

printf("%e\n\n", min); //underflow가 발생해서 숫자가 날아간다.

답변 1

0

%f로 출력하면 말씀하신대로 %e (지수표현)에 비해

정밀성이 떨어지기 때문에 모두 0으로 출력됩니다.

사실 내부적으로는(코드 논리 상으로는) underflow가 발생하지만

출력으로 표현되지 않는 것입니다

가령 %e로 출력하면

#include <stdio.h>
#include <float.h>
int main()
{
    float min = 1.401298464e-45F;
    printf("%e\n", min); // %f가 아니라 %e로 표현한다.
    min = min / 100.0f;
    printf("%e\n\n", min); //underflow가 발생해서 숫자가 날아간다.
    return 0;
}

아래와 같이 underflow가 발생하는 것을 볼 수 있지만

$ ./a.out
1.401298e-45
0.000000e+00

%f로 출력하면

#include <stdio.h>
#include <float.h>
int main()
{
    float min = 1.401298464e-45F;
    printf("%f\n", min); // %f가 아니라 %e로 표현한다.
    min = min / 100.0f;
    printf("%f\n\n", min); //underflow가 발생해서 숫자가 날아간다.
    return 0;
}

아래와 같이 모두 0으로 출력되는 것을 볼 수 있습니다.

$ ./a.out
0.000000
0.000000

 

 

ILLIP님의 프로필 이미지
ILLIP

작성한 질문수

질문하기