작성
·
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