为什么没有 cmath 的 pow 和 sqrt 模板?

问题描述

令人好奇的是,为什么 std::sqrtstd::pow 仅针对单一类型的参数进行重载?为什么它们没有实现为函数/函子模板?

解决方法

它们针对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
,

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

除此之外,参数化类型会给你带来什么?这些函数接受并返回 double,如果需要,您可以随时将其转换为普通的 intfloat

我更正第二点:正如 M.A. 和 Francois Andrieux 指出的那样,在某些情况下这会很有用。不过,我相信就 <cmath> 而言,答案仍然成立。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...