You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用泰勒级数实现sin函数计算结果与预期不符求助

问题排查与修复方案

核心问题说明

你遇到的结果异常由两个关联问题共同导致:

  • 三角函数的泰勒展开公式中,输入x的单位是弧度,你代码直接传入了角度值45,没有做单位转换,计算目标本身和你的预期不符。
  • 你对sin(45°)的理论值记忆有误:sin(45°)的正确值为√2/2≈0.7071,你提到的0.850904是sin(45弧度)的理论值,你之前的代码输出37.93是因为45属于大数值,迭代1000次还未达到收敛条件,产生了计算误差。

修复方案

场景1:你需要计算的是sin(45°)

先把角度值转换为弧度值再传入自定义sin函数即可,1度对应的弧度为π/180,优化后代码如下:

import math

def faktorial(z):
    a = 1
    for x in range(1, z+1):
        a = a * x
    return a

def sin(x):
    p = 0
    # 弧度值较小时泰勒级数收敛很快,迭代20次精度已经足够
    for k in range(0, 20):
        a = (-1) ** k
        b = x ** (2*k + 1)
        c = faktorial(2*k + 1)
        p += (a * b) / c
    return p

# 角度转弧度
x_deg = 45
x_rad = x_deg * math.pi / 180
print(sin(x_rad))

运行后输出结果约为0.7071,和sin(45°)的理论值一致。

场景2:你需要计算的是sin(45弧度)

先对输入的弧度值做2π模运算,把输入折叠到[-π, π]区间内再计算,大幅提升收敛速度:

import math

def faktorial(z):
    a = 1
    for x in range(1, z+1):
        a = a * x
    return a

def sin(x):
    # 先折叠输入到[-π, π]区间
    x = x % (2 * math.pi)
    if x > math.pi:
        x -= 2 * math.pi
    p = 0
    for k in range(0, 20):
        a = (-1) ** k
        b = x ** (2*k + 1)
        c = faktorial(2*k + 1)
        p += (a * b) / c
    return p

x = 45
print(sin(x))

运行后输出结果约为0.8509,和你提到的预期值一致。

可选优化建议

  • 现有代码每次循环都重新计算完整阶乘和高次幂,性能浪费较大,你可以改为递推计算每一项的数值,不需要重复计算历史值,运行效率会提升数倍。
  • 阶乘数值增长极快,当迭代次数过高时会出现整数溢出问题,实际场景下不需要设置1000次这么高的迭代次数,20~30次已经能满足绝大多数精度要求。

内容的提问来源于stack exchange,提问作者Adhi Aryadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:36:04