sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...
cos(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + ...
x 為弧度。收斂速度極快,雙精度下約 10-15 項即達機器精度。
const double PI = 3.14159265358979323846;
double mySin(double deg) {
double rad = deg * PI / 180.0;
double term = rad, sum = rad;
for (int n = 3; ; n += 2) {
term *= -rad * rad / (n * (n-1)); // 遞推公式:term_n = -term_{n-2} * x² / (n*(n-1))
sum += term;
if (fabs(term) < 1e-12) break; // 精度閾值
}
return sum;
}
double myCos(double deg) {
double rad = deg * PI / 180.0;
double term = 1.0, sum = 1.0;
for (int n = 2; ; n += 2) {
term *= -rad * rad / (n * (n-1));
sum += term;
if (fabs(term) < 1e-12) break;
}
return sum;
}
pow 和階乘,利用 term_n = -term_{n-2} * x² / (n*(n-1))。fmod(rad, 2*PI) 減少項數。1e-12 終止,雙精度約 15-16 位有效數字。輸入 30 度:
mySin = 0.5000000000000001
std::sin = 0.5
誤差 ~ 1e-16
FSIN/FCOS、ARM VFP/NEON 向量化。