programing

printf 및 long double

newsource 2022. 8. 16. 23:26

printf 및 long double

Windows(윈도우)의 Netbeans(넷빈)의 gcc.long double ?? ?? ?printf 「」%lf 틀렸어?

코드:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

출력:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...

- - - 음음음 yes yes yes yes yes yes yes yes yes 。long double , 을.%Lf ' (,, 문 'L')

printf manpage에서:

l (ell) 다음의 정수 변환은 long int 인수 또는 부호 없는 long int 인수에 대응합니다.또는 다음 n 변환은 long int 인수에 대한 포인터에 대응합니다.또는 다음 c 변환은 wint_t 인수에 대한 포인터에 대응합니다.

그리고.

L a, A, e, E, f, F, g 또는 G 변환 후의 A는 긴 이중 인수에 대응합니다.(C99는 %LF를 허용하지만 SUSv2는 허용하지 않습니다).

당신은 '이렇게'를 원하죠?%Le 아니라, 이에요.%le

편집: 추가 조사 결과 Mingw는 MSVC/win32 런타임(printf 등)을 사용하고 있는 것으로 나타났습니다.이 런타임은 긴 더블에서 더블로 매핑됩니다.따라서 네이티브 롱 더블을 제공하는 컴파일러(gcc 등)와 실행 시간을 혼합하는 것은 엉망으로 보이지 않습니다.

C 번호80비트 부동소수점 번호)를 , MinGW, I/O 형식 long double==double(Microsoft »)

단, MinGW에는 롱 더블을 적절히 지원하는 일련의 대체 구현도 포함되어 있습니다.이 명령어를 사용하려면 함수 이름 앞에 다음 명령어를 붙입니다.__mingw___mingw_printf, 글로벌하게 「전역적으로」, 「전역적으로」를 사용할 #define printf __mingw_printf 「」를 사용합니다.-D__USE_MINGW_ANSI_STDIO, 모든 의 ( 「」, 「MinGW」)이 하게 됩니다.printf- - - - - 。

잘못된 수식어 외에 Windows에 대한 gcc의 어떤 포트가 Microsoft C 라이브러리를 사용하고 있습니까?mingw는 80비트 길이의 더블을 지원하지 않는 것으로 기억합니다(Microsoft C 컴파일러는 다양한 이유로 64비트 길이의 더블을 사용합니다).

롱더블 테스트에 이 문제가 발생했는데, 아아, 수정안을 발견했어요!프로젝트를 -D__USE_MINGW_ANSI_STDIO로 컴파일해야 합니다.

Jason Huntley@centurian/home/developer/dependencies/Python-2.7.3/test $gcc main.c

Jason Huntley@centurian / home / developer / dependencies / Python-2.7.3 / test $a.exe c = 0.000000

Jason Huntley@centurian / home / developer / dependencies / Python-2.7.3 / test $gcc main . c - D _ USE _ MINGW _ ANSI _ STDIO

Jason Huntley@centurian / home / developer / dependencies / Python-2.7.3 / test $a.exe c = 42.000000

코드:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}

C99의 길이 수식자long double인 것 같다L가 아니라l.man fprintf(또는 Windows의 경우 동등)에서 특정 플랫폼에 대해 알려줍니다.

다른 답변에서 설명한 바와 같이 올바른 변환 지정자는 다음과 같습니다."%Lf".

다음을 사용하여 포맷 경고를 설정할 수 있습니다.-Wformat(또는-Wall다음을 포함합니다.-Wformatgcc 호출 중)

$ gcc 소스c$ gcc - 벽면 소스.csource.c: 함수 'main'에서:
source.c:5: warning: "%lf" 형식은 "double" 유형을 예상하지만 인수 2에는 "long double" 유형이 있습니다.source.c:5: warning: 형식 "%le"은 유형 "double"을 예상하지만 인수 3은 유형 "long double"을 가집니다.$

C/C++의 printf 및 scanf 함수는 Microsoft C 라이브러리를 사용하며 이 라이브러리는 10바이트 길이의 더블을 지원하지 않습니다.따라서 C/C++ 코드에서 printf 및 scanf 함수를 사용하여 출력으로 긴 더블을 인쇄하고 일부 입력을 긴 더블로 받으면 항상 잘못된 결과가 나타납니다.

long double을 사용하려면 printf 및 scanf 대신 " __mingw_printf" 및 " __mingw_scanf" 함수를 사용해야 합니다.10바이트 길이의 더블을 지원합니다.

또는 "#define printf __mingw_printf " 및 "#define scanf "와 같은 두 개의 매크로를 정의할 수 있습니다.

long double에 표준 형식 사용: %Lf

언급URL : https://stackoverflow.com/questions/4089174/printf-and-long-double