gpt4 book ai didi

c++ - 计算定点数的 sin() 和 cos() 的简单三角算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:03 30 4
gpt4 key购买 nike

正如我在其他问题中所展示的,我目前正在实现一个 C++ 元编程库,其中包括一组用于编译时算术的类型和元函数。

我现在的目标是为我的定点类型实现三角函数 sincos
我的问题是我找到的每篇关于三角算法的论文都在谈论 CORDIC或者某种泰勒级数。 CORDIC 的问题是它需要大量通过查找表预先计算的值,而我无法通过 tmp 轻松提供它。此外,CORDIC 的目的是在没有乘法器的硬件中计算三角函数,我完全有能力用我的库进行乘法运算。

所以我的问题是:除了 CORDIC 和泰勒级数之外,还有其他简单的方法来计算三角函数吗?

最佳答案

最后我实现了 sin通过泰勒级数的元函数,默认使用 10 个项的系列(可以配置)。我的实现基于 this interesting article .

我的库包括使用迭代器实现的 tmp for 循环,以及 expression templates to allow write complex expressions in a "clear" way (与常见的模板元编程语法相比清晰 add<mul<sub<1,2>>> ...)。这使我能够从字面上复制粘贴本文提供的 C 实现:

template<typename T , typename TERMS_COUNT = mpl::uinteger<4>>
struct sin_t;

template<typename T , typename TERMS_COUNT = mpl::uinteger<4>>
using sin = typename sin_t<T,TERMS_COUNT>::result;

/*
* sin() function implementation through Taylor series (Check http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html)
*
* The C equivalent code is:
*
* // Calculate sin(x) using j terms
* float sine(float x, int j)
* {
* float val = 1;
*
* for (int k = j - 1; k >= 0; --k)
* val = 1 - x*x/(2*k+2)/(2*k+3)*val;
*
* return x * val;
* }
*/

template<mpl::fpbits BITS , mpl::fbcount PRECISION , unsigned int TERMS_COUNT>
struct sin_t<mpl::fixed_point<BITS,PRECISION>,mpl::uinteger<TERMS_COUNT>>
{
private:
using x = mpl::fixed_point<BITS,PRECISION>;

using begin = mpl::make_integer_backward_iterator<TERMS_COUNT-1>;
using end = mpl::make_integer_backward_iterator<-1>;

using one = mpl::decimal<1,0,PRECISION>;
using two = mpl::decimal<2,0,PRECISION>;
using three = mpl::decimal<3,0,PRECISION>;

template<typename K , typename VAL>
struct kernel : public mpl::function<decltype( one() - ( x() * x() )/(two() * K() + two())/(two()*K()+three())*VAL() )> {};

public:
using result = decltype( x() * mpl::for_loop<begin , end , one , kernel>() );
};

Here是项目仓库中实现的标题。

关于c++ - 计算定点数的 sin() 和 cos() 的简单三角算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753765/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com