#ifndef CORE_TOOLS_TEMPLATE_TOOLS_RECURSIVE_SINE_H
#define CORE_TOOLS_TEMPLATE_TOOLS_RECURSIVE_SINE_H
namespace CoreTools
{
template<double& Radian,int Index,int MaxTerms>
struct SineSeries
{
enum
{
Continue = Index + 1 != MaxTerms,
NextIndex = (Index + 1 ) * Continue,
NextMaxTerms = MaxTerms * Continue,
};
static double Value()
{
return 1 - Radian * Radian / (2.0 * Index + 2.0) /
(2.0 * Index + 3.0) *
SineSeries<Radian, NextIndex, NextMaxTerms>::Value();
}
};
// Radian在0和2π之间。
template<double& Radian,int MaxTerms = 10>
struct RecursiveSine
{
static inline double Sin()
{
return Radian * SineSeries<Radian,0,MaxTerms>::Value();
}
};
}
#define RECURSIVE_SINE(r) CoreTools::RecursiveSine<r>::Sin()
#define SINE_SPECIALIZATION_DEFINITION(variableName,radian) \
extern double variableName; \
double variableName = radian; \
namespace CoreTools { \
template<> struct SineSeries<variableName,0,0> \
{ static double Value() \
{ return 1.0; } }; }
#endif // CORE_TOOLS_TEMPLATE_TOOLS_RECURSIVE_SINE_H
// 测试cpp
SINE_SPECIALIZATION_DEFINITION(g_Value0_0,0.0);
SINE_SPECIALIZATION_DEFINITION(g_Value0_1 , 0.1);
SINE_SPECIALIZATION_DEFINITION(g_Value0_21 , 0.21);
SINE_SPECIALIZATION_DEFINITION(g_Value0_3 , 0.3);
SINE_SPECIALIZATION_DEFINITION(g_Value0_41 , 0.41);
SINE_SPECIALIZATION_DEFINITION(g_Value0_501 , 0.501);
SINE_SPECIALIZATION_DEFINITION(g_Value0_6001 , 0.6001);
SINE_SPECIALIZATION_DEFINITION(g_Value0_7 , 0.7);
SINE_SPECIALIZATION_DEFINITION(g_Value0_85 ,0.85);
SINE_SPECIALIZATION_DEFINITION(g_Value0_9 ,0.9);
SINE_SPECIALIZATION_DEFINITION(g_Value1_03 ,1.03);
SINE_SPECIALIZATION_DEFINITION(g_Value2_22 ,2.22);
SINE_SPECIALIZATION_DEFINITION(g_Value3_23 , 3.23);
SINE_SPECIALIZATION_DEFINITION(g_Value4_89 , 4.89);
SINE_SPECIALIZATION_DEFINITION(g_Value5_66 ,5.66);
SINE_SPECIALIZATION_DEFINITION(g_Value6_1 , 6.1);
int main()
{
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_0), sin(g_Value0_0) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_1), sin(g_Value0_1) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_21), sin(g_Value0_21) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_3), sin(g_Value0_3) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_41), sin(g_Value0_41) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_501), sin(g_Value0_501) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_6001), sin(g_Value0_6001) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_7), sin(g_Value0_7) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_85), sin(g_Value0_85) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value0_9), sin(g_Value0_9) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value1_03), sin(g_Value1_03) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value2_22), sin(g_Value2_22) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value3_23), sin(g_Value3_23) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value4_89), sin(g_Value4_89) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value5_66), sin(g_Value5_66) ,0.001 );
ASSERT_APPROXIMATE( RECURSIVE_SINE(g_Value6_1), sin(g_Value6_1) ,0.001 );
}
编译期三角函数计算
最新推荐文章于 2021-09-19 10:06:10 发布