std :: pow (double, int)가 C ++ 11에서 제거 된 이유는 무엇입니까?
로 보면서 q는 정수 연산 P ^ Q (지수)에 효율적인 방법 과 C ++ 98과 C ++ 11 개 표준을 검토 나는 분명히 나타났습니다 std::pow(double, int)
과부하 (11) C ++에서 제거되었다.
C ++ 98 26.5 / 6에서는 double pow(double, int);
서명이 있습니다.
C ++ 11 26.8에서 내가 찾을 수있는 것은 한 쌍의 float
,, double
또는을 취하는 오버로드 long double
와 정수와 이중 매개 변수 유형이 혼합 된 경우 pow(double, double)
오버로드를 선택해야한다는 명시 적 메모뿐이었습니다 .
이것은 이전 의도에 대한 설명 일 뿐입니 까, C ++ 98에서 잘못 추가되었거나 실제로 C ++ 11에서 제거 되었습니까?
분명히이 pow(double, int)
버전은 최적화를위한 좋은 기회를 제공하므로 제거되는 것이 이상해 보입니다. 컴파일러는 여전히 최적화 된 오버로드를 제공하는 표준을 준수합니까?
double pow(double, int);
사양에서 제거되지 않았습니다. 단순히 다른 단어로 변경되었습니다. 이제 [c.math] / p11에 있습니다. 계산 방법은 구현 세부 사항입니다. 변경된 유일한 C ++ 03 서명은 다음과 같습니다.
float pow(float, int);
이제 double을 반환합니다.
double pow(float, int);
그리고 이 변화는 C 호환성을 위해 이루어졌다.
설명 :
26.8 [cmath] / p11 말한다 :
또한 다음을 보장하기에 충분한 추가 과부하가 있어야합니다.
double 매개 변수에 해당하는 인수에 long double 유형이있는 경우 double 매개 변수에 해당하는 모든 인수는 효과적으로 long double로 캐스트됩니다.
그렇지 않고 double 매개 변수에 해당하는 인수에 double 유형 또는 정수 유형이 있으면 double 매개 변수에 해당하는 모든 인수는 효과적으로 double로 캐스트됩니다.
그렇지 않으면 double 매개 변수에 해당하는 모든 인수가 효과적으로 float로 캐스트됩니다.
이 단락은 다음을 포함하여 전체적인 과부하를 의미합니다.
double pow(double, int);
double pow(double, unsigned);
double pow(double, unsigned long long);
기타
이는 실제 과부하이거나 제한된 템플릿으로 구현 될 수 있습니다. 개인적으로 두 가지 방법으로 구현했으며 제한된 템플릿 구현을 강력히 선호합니다.
최적화 문제를 해결하기위한 두 번째 업데이트 :
구현은 모든 과부하를 최적화 할 수 있습니다. 그러나 최적화는 그저 그것 이어야한다는 것을 기억하십시오 . 최적화 된 버전은 동일한 답변을 반환해야합니다. pow와 같은 함수 구현 자의 경험은 적분 지수를 사용하는 구현이 부동 소수점 지수를 사용하는 구현과 동일한 답을 제공하는지 확인하기 위해 문제가 발생할 때까지 "최적화"가 종종 느려진다는 것입니다.
데모로 다음 프로그램은 pow(.1, 20)
std :: pow를 사용하여 한 번은 두 번, 그리고 적분 지수를 활용하는 "최적화 된"알고리즘을 사용하여 두 번 인쇄합니다 .
#include <cmath>
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setprecision(17) << std::pow(.1, 20) << '\n';
double x = .1;
double x2 = x * x;
double x4 = x2 * x2;
double x8 = x4 * x4;
double x16 = x8 * x8;
double x20 = x16 * x4;
std::cout << x20 << '\n';
}
내 시스템에서 다음과 같이 인쇄됩니다.
1.0000000000000011e-20
1.0000000000000022e-20
또는 16 진수 표기법 :
0x1.79ca10c92422bp-67
0x1.79ca10c924232p-67
그리고 네, pow의 구현 자들은 정말 낮은 수준의 모든 비트에 대해 걱정합니다.
So while the freedom is there to shuffle pow(double, int)
off to a separate algorithm, most implementors I'm aware of have given up on that strategy, with the possible exception of checking for very small integral exponents. And in that event, it is usually advantageous to put that check in the implementation with the floating point exponent so as to get the biggest bang for your optimization buck.
참고URL : https://stackoverflow.com/questions/5627030/why-was-stdpowdouble-int-removed-from-c11
'program tip' 카테고리의 다른 글
srcdoc =“…”와 src =“data : text / html,…”의 차이점은 (0) | 2020.11.25 |
---|---|
모든 공백을 무시하도록 vimdiff를 구성하는 방법이 있습니까? (0) | 2020.11.25 |
Android ListView 어댑터 notifyDataSetInvalidated () 대 notifyDataSetChanged () (0) | 2020.11.25 |
Docker의 사용자 파일 소유권 이해 : 연결된 볼륨의 권한 변경을 방지하는 방법 (0) | 2020.11.25 |
C #에서 이벤트를 어떻게 기다리나요? (0) | 2020.11.25 |