为什么不是 cmath 的 pow 和 sqrt 模板?
Why aren't cmath's pow and sqrt templates?
出于好奇,为什么 std::sqrt
和 std::pow
只为单一类型的参数重载?为什么它们没有作为 function/functor 模板实施?
<cmath>
中的'c'字面意思就是C库函数的集合。以此类推,<stdio.h>
可以作为 <cstdio>
等包含在 C++ 中,并且由于 C 没有模板,因此在 <cmath>
.
中也不会做任何事情
除此之外,参数化类型会给您带来什么?这些函数采用 return double
s,如果你需要的话,你可以随时将其转换为普通的 int
或 float
。
我对第二点进行了更正:M.A。 Francois Andrieux 指出,在某些情况下这会很有用。但是,我相信就 <cmath>
而言,答案仍然成立。
它们 为 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
出于好奇,为什么 std::sqrt
和 std::pow
只为单一类型的参数重载?为什么它们没有作为 function/functor 模板实施?
<cmath>
中的'c'字面意思就是C库函数的集合。以此类推,<stdio.h>
可以作为 <cstdio>
等包含在 C++ 中,并且由于 C 没有模板,因此在 <cmath>
.
除此之外,参数化类型会给您带来什么?这些函数采用 return double
s,如果你需要的话,你可以随时将其转换为普通的 int
或 float
。
我对第二点进行了更正:M.A。 Francois Andrieux 指出,在某些情况下这会很有用。但是,我相信就 <cmath>
而言,答案仍然成立。
它们 为 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