programing

printf()가 플로트를 더블로 승격시키는 이유는 무엇입니까?

css3 2023. 8. 23. 21:54

printf()가 플로트를 더블로 승격시키는 이유는 무엇입니까?

이전 질문에서:

통과를 시도하는 경우float로.printf로 승격됩니다.double전에printf받음

printf()변수 함수가 올바른가요?따라서 변수 함수는 다음을 촉진합니다.float의 주장.double통과하기 전에?

예, 변수 함수에 대한 float 인수는 이중으로 승격됩니다.

초안 C99 표준 섹션6.5.2.2함수 호출은 다음과 같습니다.

[...]및 유형 플로트가 있는 인수는 이중으로 승격됩니다.이를 기본 인수 승격이라고 합니다. [...]

초안 C++ 표준 섹션에서5.2.2함수 호출:

[...]부동점 승격(4.6)의 대상이 되는 부동점 유형, 인수 값이 호출 전에 승격된 유형으로 변환됩니다. [...]

및 섹션4.6:

유형 부동의 pr 값은 유형 이중의 pr 값으로 변환할 수 있습니다.값은 변경되지 않습니다.

cppreference는 C++ 웰에서 변수 함수에 대한 기본 변환을 다룹니다.

  • std::tftr_t가 void*로 변환됩니다.
  • 부동 소수점 승격에서와 같이 부동 소수점 인수가 이중으로 변환됩니다.
  • bool, char, short 및 unscopeed 열거는 정수 승격에서와 같이 int 또는 wide 정수 유형으로 변환됩니다.

우리는 C에서 볼 수 있으며, 아마도 C++에서 이 변환은 K&RC와의 호환성을 위해 국제 표준-프로그래밍 언어-C(강조 사항)의 근거에서 유지되었습니다.

과거 관행과의 호환성을 위해 모든 인수 촉진은 프로토타입 선언이 없는 경우 K&R에 설명된 대로 발생하며, 여기에는 항상 바람직한 플로트 촉진이 포함됩니다.

질문의 이유에 대해 말하자면, 그것은 간단합니다: C(및 C++) 표준은 고려합니다.double"기본" 부동 소수점 유형이 될 수 있습니다.float(대부분의 프로그래머가 부동 소수점 번호를 사용할 때 기본값으로 사용합니다.)

이는 다음을 관찰하여 확인할 수 있습니다.

  1. 3.14이다.double(원하는 경우)float당신은 추가 단계를 밟고 추가해야 합니다.f)
  2. 표준 수학 함수는 다음과 같습니다.double기본적으로(예:sin()을 보다double당신이 원한다면float당신은 사용해야 합니다.sinf())

이것으로, 그것은 더 "자연스러운" 것처럼 보입니다.float로 승격할 것입니다.double변수 함수 호출에서, 다음을 고려할 때.double는 언어의 "자연스러운" 기본값입니다.

함수 프로토타입이 주어지면 형식 플로트는 후행 인수에 사용될 때만 자동으로1 승격됩니다.기능 인쇄는 다음을 사용합니다.

int printf(const char * restrict format, ...);

1 (인용: ISO/IEC 9899:201x 6.5.2.2 기능 호출)
각 인수에 대해 정수 승격이 수행되고 유형 플로트가 있는 인수는 두 배로 승격됩니다.이를 기본 인수 승격이라고 합니다.
기본 인수 승격은 후행 인수에 대해 수행됩니다.

왜냐하면 (C99 또는 C11) 표준에 그렇게 나와 있기 때문입니다.2501번 답변을 참조하십시오.

가지 인 이유가 : 의 첫 현재 ( 서버 연산이 : 여부역는몇태이사와있기않다시로템프데구현최사스그스블릿크톱재됨용가체현초래에밍의은에지중니습유인가연가하적요지용이산실동점▁(▁there▁for태:▁that▁the▁prag▁are부와▁history▁have▁that▁severalfirst▁factithmeticmat▁program톱,▁point▁oper크▁oper스▁and여▁reasons▁on▁current 서버...) 프로세서에서 연산 연산이 가능하다는 사실double와 거의 같은 효율성입니다.float 일부 (FPU를 추가하는 합니다.)float하드웨어에 의해, 그리고 모든 작업을 위한 라이브러리가 필요합니다.double마지막으로, 그러한 규칙은 약간 더 간단한 호출 규약ABI를 가능하게 한다고 생각합니다.

을 생각하다float의 종의로서.short double(물론 C에서는 불법입니다.) A.float주로 메모리를 압축해야 할 때 유용합니다(정밀도 손실을 감당할 수 있음).자세한 내용은 http://floating-point-gui.de/ 도 참조하십시오.

언급URL : https://stackoverflow.com/questions/28097564/why-does-printf-promote-a-float-to-a-double