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



我很好奇,为什么std::sqrtstd::pow只对单一类型的参数重载?为什么它们不作为函数/函子模板实现?

对于float,doublelong 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>可以包含在c++中作为<cstdio>等,由于C没有模板,那么<cmath>也没有任何内容。

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

我更正第二点:正如M.A.和弗朗索瓦·安德烈所指出的,在某些情况下,这是有用的。然而,我相信就<cmath>而言,答案仍然成立。

最新更新