부동 소수점 상수가 변수 대신 전달 될 때 % f가 큰 값을 인쇄하는 이유는 무엇입니까?


9

주어진 프로그램에서 왜 각각의 다른 결과를 얻었 printf습니까?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}

그리고 그것은 다음과 같은 출력을 보여줍니다 :

44000002048.000000
44000000000.000000

4
지금까지의 대답 4.4e10double상수가 float초기화시 변환 c되었지만에 double전달 될 때 유지 되는 상수 라고 설명합니다 printf. 그러나 f접미사 를 추가하면 float상수 가 일정 하다는 것을 알고 싶을 수도 있습니다 . 인쇄시 4.4e10f로 초기화하면 같은 값이 표시 c됩니다 4.4e10f. 부동 소수점 산술로 양질의 작업을 수행하려면 float상수와 double상수를 구별하는 것이 중요 할 수 있습니다.
Eric Postpischil

이 변환 방법에 이름이 있습니까? 그것에 대해 읽고 싶습니다.
user10056563 2009 년

당신이에서 변환 할 때 알고 싶어 double로는 floatC 언어에서 발생? 또는 전환으로 어떤 값이 발생하는지, 즉 전환이 어떤 영향을 미치는지 알고 싶습니까? 또는 다른 것?
Eric Postpischil

나는 여기의 대답 이나 표준에 대해 의문을 제기 하지 않지만, 어렸을 때 배우면서 a 와 a에 사용 했습니다 . 상황이 언제 바뀌 었습니까? 어떻게 한 것이 명시 적으로 A (단일)는 printf - ?? Cprintf("%f",x)floatprintf("%lf",x)doublefloatprintf("%hf",x)
Adrian Mole

2
%lfprintf의 @Adrian은와 동일합니다 %f. float변수 인수의 A 는 double마치로 short변환되는 것처럼 컴파일러에서 로 변환됩니다 int.
SS Anne

답변:


9

A float는 32 비트 부동 소수점 숫자를 보유하는 유형이고 상수 4.4e10double64 비트 부동 소수점 숫자 (즉 배정도 부동 소수점 숫자) 를 보유하는을 나타냅니다.

당신이 할당하는 경우 4.4e10c, 값이 4.4e10정확하게 표시 할 수없는 (매개 변수의 반올림 오류가 가수라고도 함), 가장 가까운 가능한 값 (44000002048)가 저장된다. 로 전달되면 반올림 오류를 포함하여 (으 printf) 다시 승격 됩니다 double.

두 번째 경우, 값은 double좁아 지거나 넓 히지 않고 전체 시간이며 a double가 값을 정확하게 나타낼 수있는 경우입니다 .

이것이 바람직하지 않은 동작이라면 좀 더 정밀한 c것으로 선언 할 수 있습니다 double(그러나 여전히 정밀도 한계에 도달 할 수 있음에주의하십시오).


3

실제로 두 가지 유형의 값을 여기에 인쇄하고 있습니다.

첫 번째 경우 유형의 변수에 값을 할당합니다 float. a의 정밀도 float는 대략 6 자리 또는 7 자리입니다. 따라서 값을 정확하게 표현할 수 없으면 해당 유형으로 표시 할 수있는 가장 가까운 값을 볼 수 있습니다.

두 번째 경우 4.4e10에는 type 인 상수 를 전달합니다 double. 이 유형의 정밀도는 약 16 진 자릿수이며 값이 해당 범위 내에 있으므로 정확한 값이 인쇄됩니다.


왜 마지막에 2048을 인쇄합니까?
user10056563

@ user10056563 32 비트 플로트에 저장할 수있는 4.4e10에 가장 가까운 숫자이기 때문입니다.
dbush
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.