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
다음을 포함합니다.-Wformat
gcc 호출 중)
$ 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
'programing' 카테고리의 다른 글
사용자 지정 지시문에서 v-if 지시문 시뮬레이션 (0) | 2022.08.16 |
---|---|
행/하위 구조를 사용한 루프 (0) | 2022.08.16 |
C/C++: 강제 비트 필드 순서 및 정렬 (0) | 2022.08.16 |
스토어가 정의되어 있지 않습니다.vue.syslog (0) | 2022.08.16 |
"int *nums = {5, 2, 1, 4}"이(가) 분할 장애를 일으킵니다. (0) | 2022.08.16 |