与数学lib sin相比,sin函数不准确

时间:2014-11-01 23:13:03

标签: c++ math trigonometry

我一直在尝试实现一个快速的自定义sin函数,但更重要的是,准确(我不能在我的项目中使用math.h sin)。在谈到这种数学时我不是专家,所以和我一起工作XD。在网上搜索一下后,我发现了以下代码,在某些情况下,该函数返回的结果不准确。

float SinF(float X)
{
    float Sine;

    if (X < -3.14159265F) X += 6.28318531F;
    else if (X >  3.14159265F) X -= 6.28318531F;

    if (X < 0)
    {
        Sine = 1.27323954F * X + .405284735F * X * X;
        if (Sine < 0) Sine = .225F * (Sine *-Sine - Sine) + Sine;
        else Sine = .225F * (Sine * Sine - Sine) + Sine;
    }
    else
    {
        Sine = 1.27323954F * X - 0.405284735F * X * X;
        if (Sine < 0) Sine = .225F * (Sine *-Sine - Sine) + Sine;
        else Sine = .225F * (Sine * Sine - Sine) + Sine;
    }

    return Sine;
}

示例:

Bad result example 1:
Value Passed: 1.57079637
Returned Value: 0.999999881
Correct Value: 1.00000000

Bad result example 2:
Value Passed: 1.76704633
Returned Value: 0.980933487
Correct Value: 0.980804682

Bad result example 3:
Value Passed: 1.96329641
Returned Value: 0.924392164
Correct Value: 0.923955679

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

this SO question中有sin和朋友的一系列潜在实现,但通常归结为一些常用方法:

  • 内置处理器代码(fsin)
  • Taylor series
  • CORDIC
  • 具有可选线性(或更好)插值的查找表(主要用于速度,不太准确)

有很多其他方法,但这些是我见过的更常见的方法。

还要注意浮点的固有精度限制(如user657267 linked)。例如,1.57079637并不完全是pi/2,因此其sin()可能不完全是1.事实上,您的所有&#34;正确&#34;列出的值不完全准确。您必须确定应用程序的准确程度。