如何解决为什么没有 cmath 的 pow 和 sqrt 模板?
令人好奇的是,为什么 std::sqrt
和 std::pow
仅针对单一类型的参数进行重载?为什么它们没有实现为函数/函子模板?
解决方法
它们针对float
、double
和long 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
,如果需要,您可以随时将其转换为普通的 int
或 float
。
我更正第二点:正如 M.A. 和 Francois Andrieux 指出的那样,在某些情况下这会很有用。不过,我相信就 <cmath>
而言,答案仍然成立。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。