programing

C에서 %g과 %f의 차이는 무엇입니까?

jooyons 2023. 8. 13. 09:40
반응형

C에서 %g과 %f의 차이는 무엇입니까?

저는 K&R로 C 프로그래밍 언어를 공부하고 있었습니다.이중 변수를 인쇄하는 문장에는 다음과 같이 기록되어 있습니다.

printf("\t%g\n", sum += atof(line));

여기서 합계는 이중으로 선언됩니다.더블이나 플로트의 경우 %g를 언제 사용해야 하는지, %g와 %f의 차이가 무엇인지 누가 도와줄 수 있습니까?

두 가지 모두 부동 소수점 입력/출력의 예입니다.

%g 및 %G는 과학적 표기법 플로트 %e 및 %E의 단순화자입니다.

%g은 %f(단순 부동 또는 이중) 또는 %e(과학적 표기)로 나타낼 수 있는 숫자를 사용하고 둘 중 더 짧은 숫자로 반환합니다.

인쇄 명세서의 출력은 합계 값에 따라 달라집니다.

man 페이지와 같은 참조 설명서를 참조하십시오.

f,F

이중 인수는 반올림되고 [-]dddd.ddd 스타일에서 10진수 표기법으로 변환됩니다. 여기서 소수점 문자 뒤의 자릿수는 정밀도 사양과 같습니다.정밀도가 없으면 6으로 간주되고 정밀도가 명시적으로 0이면 소수점 문자가 표시되지 않습니다.소수점이 나타나면 최소 한 자리 수가 그 앞에 나타납니다. (SUSv2는 F에 대해 알지 못하며 무한 및 NaN에 대한 문자열 표현을 사용할 수 있다고 말합니다.)C99 표준은 무한대의 경우 '[-]inf' 또는 '[-]infinity'를 지정하고, f 변환의 경우 NaN의 경우 'nan'으로 시작하는 문자열, F 변환의 경우 '[-]INFINITY' 또는 'NAN*'으로 시작하는 문자열을 지정합니다.)

g,G

이중 인수는 스타일로 변환됩니다(또는 G 변환의 경우 E).정밀도는 유효 자릿수를 지정합니다.정밀도가 누락된 경우 6자리, 정밀도가 0인 경우 1로 처리됩니다.스타일 e는 변환 지수가 -4보다 작거나 정밀도보다 크거나 같은 경우에 사용됩니다.뒤에 오는 0은 결과의 부분에서 제거됩니다. 소수점은 적어도 한 자리 뒤에 오는 경우에만 나타납니다.

E = 지수 표현식, 단순히 검정력(10, n) 또는 10^n을 의미합니다.

F = 분수 식, 기본 6자리 정밀도

G = 일반적인 표현, 간결한 방식으로 숫자를 보여주기에는 다소 현명합니다(하지만 정말입니까?)

다음 예를 참조하십시오.

코드

void main(int argc, char* argv[])  
{  
        double a = 4.5;
        printf("=>>>> below is the example for printf 4.5\n");
        printf("%%e %e\n",a);
        printf("%%f %f\n",a);
        printf("%%g %g\n",a);
        printf("%%E %E\n",a);
        printf("%%F %F\n",a);
        printf("%%G %G\n",a);
          
        double b = 1.79e308;
        printf("=>>>> below is the exbmple for printf 1.79*10^308\n");
        printf("%%e %e\n",b);
        printf("%%f %f\n",b);
        printf("%%g %g\n",b);
        printf("%%E %E\n",b);
        printf("%%F %F\n",b);
        printf("%%G %G\n",b);

        double d = 2.25074e-308;
        printf("=>>>> below is the example for printf 2.25074*10^-308\n");
        printf("%%e %e\n",d);
        printf("%%f %f\n",d);
        printf("%%g %g\n",d);
        printf("%%E %E\n",d);
        printf("%%F %F\n",d);
        printf("%%G %G\n",d);
}  

산출물

=>>>> below is the example for printf 4.5
%e 4.500000e+00
%f 4.500000
%g 4.5
%E 4.500000E+00
%F 4.500000
%G 4.5
=>>>> below is the example for printf 1.79*10^308
%e 1.790000e+308
%f 178999999999999996376899522972626047077637637819240219954027593177370961667659291027329061638406108931437333529420935752785895444161234074984843178962619172326295244262722141766382622299223626438470088150218987997954747866198184686628013966119769261150988554952970462018533787926725176560021258785656871583744.000000
%g 1.79e+308
%E 1.790000E+308
%F 178999999999999996376899522972626047077637637819240219954027593177370961667659291027329061638406108931437333529420935752785895444161234074984843178962619172326295244262722141766382622299223626438470088150218987997954747866198184686628013966119769261150988554952970462018533787926725176560021258785656871583744.000000
%G 1.79E+308
=>>>> below is the example for printf 2.25074*10^-308
%e 2.250740e-308
%f 0.000000
%g 2.25074e-308
%E 2.250740E-308
%F 0.000000
%G 2.25074E-308

Unwind가 f와 g를 가리키면 서로 다른 기본 출력이 제공됩니다.

대략적으로 말하면, 만약 당신이 내가 f로 할 소수점 이후에 무엇이 나오는지에 대한 세부사항에 더 관심이 있다면, 그리고 당신이 큰 숫자를 위해 스케일링을 원한다면 g와 함께 갑니다.먼지가 많은 기억에서 f는 숫자의 인쇄 테이블이 정렬된 상태로 유지된다면 작은 값으로 매우 좋지만 숫자가 커지고 레이아웃이 중요해진다면 g와 같은 것이 필요합니다.e는 당신의 숫자가 매우 작거나 매우 큰 경향이 있지만 결코 10에 가깝지 않을 때 더 유용합니다.

또는 출력 형식을 지정하여 매번 번호를 나타내는 문자 수를 동일하게 지정할 수 있습니다.

엉터리 답변이라 죄송합니다만 생성된 문자 수나 표시된 값의 정확도가 중요한 경우에만 어려운 답변을 얻는 주관적인 출력입니다.

%g은 플로트에서 후행 0을 제거합니다.

최대 10**6까지 인쇄(인쇄), 그 다음에 e+ 정밀도 6까지 인쇄

123456은 123456을 줍니다.

1234567은 1.23457e+06을 제공합니다.

정밀도 6까지 인쇄(인쇄 > 10**-4)한 후 6 이전으로 반올림합니다.

1.23456은 1.23456입니다.

1.234567은 1.23457을 줍니다.

정밀도 4까지 인쇄(인쇄 < 10**-4), 그렇지 않으면 ne-0p로 인쇄

0.0001은 0.0001을 줍니다.

0.000001은 1e-06을 제공합니다.

0.12345678은 0.123457입니다.

%G는 동일하지만 exp(e)는 exp(E)가 됩니다.

세 가지 형식 지정자 %e, %f 및 %g는 모두 C에서 부동 및 이중 데이터 유형으로 작업하는 데 사용됩니다.

%e지수 검정력(과학 형식)으로 데이터를 나타냅니다.

%f는 출력을 원하는 소수 자릿수까지 제어할 수 있지만 최대 6자리까지의 데이터를 정규 소수 자릿수로 나타냅니다.

%g십진수 형식을 나타내며 후속 0을 제거합니다.

예: c 코드에서 %e, %f 및 %g을 사용하는 방법:

#include <stdio.h>

int main() 
{ 
    double ans = 123.45; 
    
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n\n\n",ans);
    // 
    
    
    ans = 123.45e8; // scientific way of writing 123.45 * 10^8
    
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n\n\n",ans); 
    
    
    ans = 123.45e-8; // scientific way of writing 123.45 * 10^(-8) i,e. 0.0000012345
    
    // %f has upto 6 digits precision
    // 0.0000012345 converted to 0.000001 (max 6 precision allowed)
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n",ans); 
    
    return 0;
}

출력은 다음과 같습니다.

Printing using %f 123.450000
Printing using %e 1.234500e+02
Printing using %g 123.45

Printing using %f 12345000000.000000
Printing using %e 1.234500e+10
Printing using %g 1.2345e+10

Printing using %f 0.000001
Printing using %e 1.234500e-06
Printing using %g 1.2345e-06

%f와 %g은 동일한 작업을 수행합니다.유일한 차이점은 %g이 %f의 더 짧은 형태라는 것입니다.이것은 %g에 비해 %f에서 소수점이 더 큰 후의 정밀도입니다.

언급URL : https://stackoverflow.com/questions/5913102/what-is-the-difference-between-g-and-f-in-c

반응형