如何解决试图弄清楚cmath.h如何计算Trancedental函数的值,但是函数调用在头文件中似乎是递归的
我正在使用Visual Studio 2019。 输入数字作为参数时,我编写了基本代码来计算和打印正弦值。 当我右键单击使用math.h和cmath.h作为标头的sin()调用时,首先将我带到第234行的cmath.h标头中对sin的定义,看起来像这样:
_NODISCARD _Check_return_ inline float sin(_In_ float _Xx) noexcept /* strengthened */ {
return _CSTD sinf(_Xx);
}
现在,当我右键单击函数返回部分中的sinf()时,我将在corecrt_math.h标头中定义正弦的定义。
_Check_return_ __inline float __CRTDECL sinf(_In_ float _X)
{
return (float)sin(_X);
}
现在,当我右键单击sin()函数时,它将带我回到cmath.h标头。 这似乎非常反直观,因为当我使它们的头文件伴随另一个头时,我在其中声明了.cpp文件中未实现的功能,但是这里似乎既没有.cpp文件,也没有任何实现trencedental函数的头。 / p>
那么C ++如何计算这些函数?
解决方法
问题很广泛,但答案突出:
Argument reduction到0到pi / 4之类的子范围。
使用Minimax approximation进行评估,例如一个精巧的多项式除以另一个多项式。
,您可能会有些困惑,因为sin
的定义可以在namespace std { }
中出现。当std::sin
调用::sinf
依次调用::sin
时,它看起来可能是递归的,但这只是确保所有函数给出相同结果的一种方式。这毕竟是相同的数学正弦函数。
MSVC具有一些实现,具体取决于您的CPU。这些不是C ++,而是汇编语言。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。