double in printf의 올바른 형식 지정자
올바른 형식 지정자는 무엇입니까?double
printf로요?그런가요?%f
아니면?%lf
내 생각엔%f
잘 모르겠어요.
코드샘플
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"
는 (또는 적어도1개의) 더블의 올바른 형식입니다.의 형식은 없습니다.float
, 왜냐하면 당신이 통과를 시도했을 때float
로.printf
로 승격됩니다.double
전에printf
수신합니다1. "%lf"
또한 현행 표준 하에서도 허용됩니다.l
그 뒤에 있는 경우 효과가 없는 것으로 지정됩니다.f
변환 지정자(특히).
이 장소에서는,printf
형식 문자열은 와 크게 다르다scanf
(그리고fscanf
, 등) 포맷 문자열.출력의 경우 값을 전달하고 있습니다. 이 값은 다음 값에서 승격됩니다.float
로.double
variadic 파라미터로 전달되는 경우.입력의 경우 포인터를 전달하고 있지만 승격되지 않았으므로 다음과 같이 알려야 합니다.scanf
읽고 싶은지 아닌지float
또는double
에 대해서는scanf
,%f
읽고 싶다는 의미입니다.float
그리고.%lf
읽고 싶다는 의미입니다.double
(그리고, 그 가치가 있는 것은, 잠시 동안,long double
, 를 사용합니다.%Lf
어느 쪽이든printf
또는scanf
).
1. C99, §6.5.2/6 : "호출함수를 나타내는 식에 프로토타입을 포함하지 않는 형식이 있으면 각 인수에 대해 정수 승진을 하고 유형 플로트를 갖는 인수는 2배로 승격한다.이를 디폴트 인수 프로모션이라고 합니다.C++에서는 표현은 다소 다르지만(예를 들어 "protype"이라는 단어를 사용하지 않음), 효과는 동일합니다. 즉, 모든 가변 파라미터가 함수에 의해 수신되기 전에 기본 프로모션을 수행합니다.
그럴 수 있다.%f
,%g
또는%e
숫자 형식을 지정하는 방법에 따라 달라집니다.자세한 내용은 여기를 참조하십시오.그l
에 수식어가 필요합니다.scanf
와 함께double
, 단, 에 없습니다.printf
.
C99 표준(즉 N1256 드래프트)의 경우 규칙은 fprintf(printf, sprintf, ...) 또는 scanf 함수 종류에 따라 달라집니다.
추출된 관련 부품은 다음과 같습니다.
서문
이 제2판은 ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995 및 ISO/IEC 9899/COR2:1996에 의해 수정 및 수정된 초판 ISO/IEC 9899:1990을 취소하고 대체합니다.이전 에디션에서 크게 변경된 내용은 다음과 같습니다.
%lf
변환 지정자가 허용됨printf
7.19.6.1그
fprintf
기능.7 길이 수식어와 그 의미는 다음과 같다.
l (ell) (...)이 다음의 a, A, e, E, f, F, g 또는 G 변환 지정자에 영향을 주지 않음을 지정합니다.
L 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.
에 대해 지정된 것과 동일한 규칙fprintf
지원하다printf
,sprintf
및 유사한 기능을 제공합니다.
7.19.6.2그
fscanf
기능.11 길이 수식어와 그 의미는 다음과 같다.
l (ell) 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 타입 포인터를 2배로 하는 인수에 적용되는 것을 지정합니다.
L 다음 a, A, e, E, f, F, g, 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.
12 변환 지정자와 그 의미는 다음과 같습니다.a, e, f, g는 옵션으로 부호화된 부동 소수점 숫자와 일치합니다. (...)
14 변환 지정자 A, E, F, G 및 X도 유효하며 각각 a, e, f, g 및 x와 동일하게 동작한다.
한마디로 말하면fprintf
다음의 지정자 및 대응하는 타입이 지정됩니다.
%f
-> 2배%Lf
-> 긴 더블.
및 을 위해fscanf
그 이유는 다음과 같습니다.
%f
-> 플로트%lf
-> 2배%Lf
-> 긴 더블.
포맷%lf
완전히 정확하다printf
을 위해 포맷하다.double
사용하신 그대로입니다.코드에는 아무런 문제가 없습니다.
포맷%lf
에printf
는 C 언어의 오래된 버전(C99)에서는 지원되지 않았습니다.이 버전에서는 포맷 지정자 간에 피상적인 "불일관성"이 생깁니다.double
에printf
그리고.scanf
그 표면적인 불일치는 C99에서 수정되었다.
를 사용할 필요가 없습니다.%lf
와 함께double
에printf
를 사용할 수 있습니다.%f
괜찮으시다면 (도)%lf
그리고.%f
등가printf
). 그러나 현대 C에서는 다음과 같이 사용하는 것이 이상적입니다.%f
와 함께float
,%lf
와 함께double
그리고.%Lf
와 함께long double
양쪽에서 일관되게printf
그리고.scanf
.
%Lf
(대문자에 주의해 주세요.L
)는 롱 더블 포맷 지정자입니다.
플레인용doubles
,어느 하나%e
,%E
,%f
,%g
또는%G
할 거다.
언급URL : https://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf
'source' 카테고리의 다른 글
음의 부동소수점 0은 C에서 false로 평가되는 것이 보증됩니까? (0) | 2022.11.03 |
---|---|
java.util 간의 간단한 변환.날짜 및 XMLGregorian 캘린더 (0) | 2022.11.03 |
IntelliJ 클래스 경로에 속성 파일 추가 (0) | 2022.11.03 |
레일 프로젝트에서 MySQL 대신 MariaDB 사용 (0) | 2022.11.03 |
MySQL: SyntaxError:예기치 않은 식별자 (0) | 2022.11.03 |