我一直在尝试实现一个快速的自定义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
任何帮助都将不胜感激。
答案 0 :(得分:1)
在this SO question中有sin
和朋友的一系列潜在实现,但通常归结为一些常用方法:
有很多其他方法,但这些是我见过的更常见的方法。
还要注意浮点的固有精度限制(如user657267 linked)。例如,1.57079637
并不完全是pi/2
,因此其sin()
可能不完全是1.事实上,您的所有&#34;正确&#34;列出的值不完全准确。您必须确定应用程序的准确程度。