为什么没有标准的C ++数学库<math>而不是C包装<cmath>?

时间:2018-03-10 03:47:56

标签: c++ stl

C ++标准在保持与C API兼容的同时引入了新的API。 C包装的标题以&#34; c&#34;开头。例如&lt; ctime&gt;,&lt; cstring&gt;和&lt; climits&gt;。他们的通讯C ++标题是&lt; chrono&gt;,&lt; string&gt;和&lt; limits&gt;。

我的问题是为什么即使旧C API存在许多缺陷,STL也不会提供新的数学库。缺陷包括但不限于:C API使用&#34; f&#34;,&#34; l&#34;和&#34; ll&#34;用于声明不同类型函数的前缀,而C ++可以重载,缺少常量,如pi和e等。

2 个答案:

答案 0 :(得分:4)

C&#39 {s} <math.h>的C ++标准库版本:<cmath><cfoo>标头只是<foo.h>的包装,其名称在std命名空间中。它们使用一些C ++功能,例如函数重载,并且可以具有更多功能。例如,<cmath>有一堆special mathematical functions

考虑std::abs。在<cmath>中,int, long, and long longfloat, double, and long double都存在重载。

答案 1 :(得分:1)

<cmath> 是 C++ 的标准库头文件,由 C 头文件 <math.h> 扩展而来,带有命名空间 std

自 C++ 17 起,特殊数学函数从 TR1 和线性插值函数 (C++ 20) 合并到标准中,这些函数包含在 <cmath> 标头中。

一些数学函数包含在 <numeric> 中,例如 constexpr 函数 gcdlcdmidpoint(来自 C++ 20)。

在 C++ 20 中添加了数学常量,它们包含在名为 <numbers> 的单独标头中,并包含在命名空间 std::numbers 中。

您仍然可以从标准数学库中找到缺陷,其中包括由于与 C 的向后兼容性而导致的函数重载不一致,并且一些数学概念包含在单独的头文件中。