为什么不是 cmath 的 pow 和 sqrt 模板?

Why aren't cmath's pow and sqrt templates?

出于好奇,为什么 std::sqrtstd::pow 只为单一类型的参数重载?为什么它们没有作为 function/functor 模板实施?

<cmath>中的'c'字面意思就是C库函数的集合。以此类推,<stdio.h> 可以作为 <cstdio> 等包含在 C++ 中,并且由于 C 没有模板,因此在 <cmath>.

中也不会做任何事情

除此之外,参数化类型会给您带来什么?这些函数采用 return doubles,如果你需要的话,你可以随时将其转换为普通的 intfloat

我对第二点进行了更正:M.A。 Francois Andrieux 指出,在某些情况下这会很有用。但是,我相信就 <cmath> 而言,答案仍然成立。

它们 floatdoublelong double.

类型重载

没有其他浮点类型,因此使用模板的更通用的解决方案没有优势。

C++ <cmath> 头文件几乎是 C 的 <math.h> 头文件的副本。

C 没有重载,所以它提供了三个不同的平方根函数:

float sqrtf(float arg);
double sqrt(double arg);
long double sqrtl(long double arg);

其他浮点函数也类似。

C++ 的 <cmath> 为所有三种浮点类型提供 重载版本的 sqrt

这里有一个例子可以证明这一点:

#include <iostream>
#include <iomanip>
#include <cmath>

int main() {
    auto f = std::sqrt(2.0F);
    auto d = std::sqrt(2.0);
    auto ld = std::sqrt(2.0L);
    std::cout << std::setprecision(64);
    std::cout << ' ' << sizeof f << ' '  << f  << '\n';
    std::cout << ' ' << sizeof d << ' '  << d  << '\n';
    std::cout        << sizeof ld << ' ' << ld << '\n';
}

我系统上的输出,展示了每次调用的不同大小和精度:

 4 1.41421353816986083984375
 8 1.4142135623730951454746218587388284504413604736328125
16 1.4142135623730950487637880730318329369765706360340118408203125