📄 mgcfastfunction.cpp
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement. The various license agreements may be found at
// the Magic Software web site. This file is subject to the license
//
// FREE SOURCE CODE
// http://www.magic-software.com/License/free.pdf
// The approximation formulas are from
//
// Handbook of Mathematical Functions
// Edited by M. Abramowitz and I.A. Stegun.
// Dover Publications, Inc.
// New York, NY
// Ninth printing, December 1972
// For the inverse tangent calls, all approximations are valid for |t| <= 1.
// To compute ATAN(t) for t > 1, use ATAN(t) = PI/2 - ATAN(1/t). For t < -1,
// use ATAN(t) = -PI/2 - ATAN(1/t).
// Speedups were measured on a Pentium II 400 Mhz with a release build of the
// code. Comparisons are to the calls sin, cos, tan, and atan in the standard
// math library.
#include "MgcFastFunction.h"
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Sin0 (MgcReal fT)
{
// assert: 0 <= fT <= PI/2
// maximum absolute error = 1.6415e-04
// speedup = 1.91
MgcReal fTSqr = fT*fT;
MgcReal fResult = 7.61e-03;
fResult *= fTSqr;
fResult -= 1.6605e-01;
fResult *= fTSqr;
fResult += 1.0;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Sin1 (MgcReal fT)
{
// assert: 0 <= fT <= PI/2
// maximum absolute error = 2.3279e-09
// speedup = 1.40
MgcReal fTSqr = fT*fT;
MgcReal fResult = -2.39e-08;
fResult *= fTSqr;
fResult += 2.7526e-06;
fResult *= fTSqr;
fResult -= 1.98409e-04;
fResult *= fTSqr;
fResult += 8.3333315e-03;
fResult *= fTSqr;
fResult -= 1.666666664e-01;
fResult *= fTSqr;
fResult += 1.0;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Cos0 (MgcReal fT)
{
// assert: 0 <= fT <= PI/2
// maximum absolute error = 1.1880e-03
// speedup = 2.14
MgcReal fTSqr = fT*fT;
MgcReal fResult = 3.705e-02;
fResult *= fTSqr;
fResult -= 4.967e-01;
fResult *= fTSqr;
fResult += 1.0;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Cos1 (MgcReal fT)
{
// assert: 0 <= fT <= PI/2
// maximum absolute error = 2.3082e-09
// speedup = 1.47
MgcReal fTSqr = fT*fT;
MgcReal fResult = -2.605e-07;
fResult *= fTSqr;
fResult += 2.47609e-05;
fResult *= fTSqr;
fResult -= 1.3888397e-03;
fResult *= fTSqr;
fResult += 4.16666418e-02;
fResult *= fTSqr;
fResult -= 4.999999963e-01;
fResult *= fTSqr;
fResult += 1.0;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Tan0 (MgcReal fT)
{
// assert: 0 <= fT <= PI/4
// maximum absolute error = 8.0613e-04
// speedup = 2.51
MgcReal fTSqr = fT*fT;
MgcReal fResult = 2.033e-01;
fResult *= fTSqr;
fResult += 3.1755e-01;
fResult *= fTSqr;
fResult += 1.0;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Tan1 (MgcReal fT)
{
// assert: 0 <= fT <= PI/4
// maximum absolute error = 1.8897e-08
// speedup = 1.71
MgcReal fTSqr = fT*fT;
MgcReal fResult = 9.5168091e-03;
fResult *= fTSqr;
fResult += 2.900525e-03;
fResult *= fTSqr;
fResult += 2.45650893e-02;
fResult *= fTSqr;
fResult += 5.33740603e-02;
fResult *= fTSqr;
fResult += 1.333923995e-01;
fResult *= fTSqr;
fResult += 3.333314036e-01;
fResult *= fTSqr;
fResult += 1.0;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan0 (MgcReal fT)
{
// assert: |fT| <= 1
// maximum absolute error = 4.8830e-03
// speedup = 2.14
MgcReal fTSqr = fT*fT;
return fT/(1.0 + 0.28*fTSqr);
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan1 (MgcReal fT)
{
// assert: |fT| <= 1
// maximum absolute error = 1.1492e-05
// speedup = 2.16
MgcReal fTSqr = fT*fT;
MgcReal fResult = 0.0208351;
fResult *= fTSqr;
fResult -= 0.085133;
fResult *= fTSqr;
fResult += 0.180141;
fResult *= fTSqr;
fResult -= 0.3302995;
fResult *= fTSqr;
fResult += 0.999866;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan2 (MgcReal fT)
{
// assert: |fT| <= 1
// maximum absolute error = 1.3593e-08
// speedup = 1.50
MgcReal fTSqr = fT*fT;
MgcReal fResult = 0.0028662257;
fResult *= fTSqr;
fResult -= 0.0161657367;
fResult *= fTSqr;
fResult += 0.0429096138;
fResult *= fTSqr;
fResult -= 0.0752896400;
fResult *= fTSqr;
fResult += 0.1065626393;
fResult *= fTSqr;
fResult -= 0.1420889944;
fResult *= fTSqr;
fResult += 0.1999355085;
fResult *= fTSqr;
fResult -= 0.3333314528;
fResult *= fTSqr;
fResult += 1.0;
fResult *= fT;
return fResult;
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -