试图弄清楚 cmath.h 如何计算 Trancedental 函数的值。但是函数调用在头文件中似乎是递归的

Posted

技术标签:

【中文标题】试图弄清楚 cmath.h 如何计算 Trancedental 函数的值。但是函数调用在头文件中似乎是递归的【英文标题】:Trying to figure out how cmath.h calculates the value of Trancedental functions.But function calling seems to be recursive in header files 【发布时间】:2020-10-06 02:07:09 【问题描述】:

我正在使用 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 文件,也没有另一个实现趋势函数的头文件。

那么 C++ 是如何计算这些函数的呢?

【问题讨论】:

两个定义都在大的 #if 块内,它们不会同时编译。您可以生成预处理文件并遵循有效的条件来查看实际编译的内容,和/或汇编文件以查看它被编译成的内容(可能是内在的)。 @dxiv 先生在头文件本身? 是的,条件在标题中,如果这就是你的意思。 【参考方案1】:

问题很广泛,但答案很突出:

Argument reduction 到像 0 到 pi/4 这样的子范围。

使用Minimax approximation 进行评估,例如一个精心设计的多项式除以另一个多项式。

【讨论】:

先生,我能理解您的困境。先生,我希望您能给我指出源代码,我可以自己阅读它。先生,我一直在尝试实现数学函数一段时间,如果您能告诉我如何实现的话,我已经找到了一个叫做 CORDIC 的东西我可以看到 C++ 使用的代码我会非常感激。 莫妮卡先生,这份文件太棒了,这是我 3 周学习的高潮。 @ShridharSharma C++ 不需要特定的三角函数实现。可以像static double my_sin_helper(double xx, double term, unsigned n) if (term + 1.0 == 1.0) return term; return term - my_sin_helper(xx, xx * term / ((n + 1) * (n + 2)), n + 2); // valid for [-pi/2 + pi/2] double my_sin_primary(double x) return x * my_sin_helper(x * x, 1.0, 1); 这样小。它是实现定义的 哦,我明白了,是的,现在我明白你为什么发送之前的文件了。 @chux-恢复莫妮卡【参考方案2】:

您可能会有些困惑,因为sin 的定义可以出现在namespace std 中。当std::sin 调用::sinf 而后者又调用::sin 时,它可能看起来是递归的,但这只是确保所有函数给出相同结果的一种方式。毕竟是同一个数学正弦函数。

MSVC 有一些实现,具体取决于您的 CPU。这些不是 C++,而是汇编。

【讨论】:

先生,我知道您可能会觉得我正在将球放在您的球场上,但请您给我一个算法和汇编代码的链接。你没有意识到你说它可以在大会上让我很高兴。 @ShridharSharma:你可以在Visual Studio 2019中自己看到。写一个小程序,在sin之前添加一个断点,切换到反汇编窗口并进入。在调试和发布中都这样做模式,查看差异。

以上是关于试图弄清楚 cmath.h 如何计算 Trancedental 函数的值。但是函数调用在头文件中似乎是递归的的主要内容,如果未能解决你的问题,请参考以下文章

试图弄清楚如何根据特定书籍的类型更改背景图像

试图弄清楚如何将总分恢复到主要打印出来。它正在显示但未存储在变量中

试图弄清楚如何从 jquery datepicker 中删除假期

我试图弄清楚如何将 dbus 与 pidgin 一起使用

C# 试图弄清楚如何将负值合并到我的代码中

您好,试图弄清楚如何仅从此文本中提取文件路径