误差
- 误差无处不在
- 有效位丢失
- 化整误差
- 尾数丢失
- 分数法
- 代码
- 十进制法
- 代码
- 验证
- a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0
- x = − b ± b 2 − 4 a c 2 a x ={-b \pm \sqrt{b^2-4ac}\over 2a} x=2a−b±b2−4ac
- 分数法
- 十进制法
- sympy
- 验证
误差无处不在
Python计算小数的误差 |
---|
>>> 0.1+0.1
0.2
>>> _+0.1
0.30000000000000004
>>>
有效位丢失
大小基本相同的数值相减,由于丢失有效数字而引起的误差。
化整误差
运用有效位数的二进制表示实数所产生的误差。上面图片的例子就是这种情况。
尾数丢失
绝对值相差较大的数值进行运算时,绝对值小的数未被反应到计算结果中而产生的误差。
分数法
使用通约分模块,直接作为分数进行运算,避免小数表示产生的化整误差。
代码
from fractions import Fraction
print(“通约分模块”,Fraction(1,10)+Fraction(1,10)+Fraction(1,10))#通约分模块
#print(Fraction(5,10),Fraction(3,5)) #5/10的3/15的约分
#print(Fraction(1,3)+Fraction(1,7)) #1/3+1/7
#print(Fraction(5,3)*Fraction(6,7)*Fraction(3,2))
十进制法
使用十进制计算模块可以避免二进制浮点数计算产生的误差。
代码
from decimal import *
print(“十进制计算模块”,Decimal(“0.1”)+Decimal(“0.1”)+Decimal(“0.1”)) #十进制计算模块
验证
通约分模块 3/10
十进制计算模块 0.3
从结果来看分数法和十进制方法是对的,处理掉了误差。
a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0
前面文章递归调用——单向汉诺塔里说要说一下Python解方程。这里来解二元一次方程,看看不同的方式产生的误差情况。
x = − b ± b 2 − 4 a c 2 a x ={-b \pm \sqrt{b^2-4ac}\over 2a} x=2a−b±b2−4ac
直接用解的公式。
import math
def fun(a,b,c):
x1 = (0-b+math.sqrt(b*b-4*a*c))/(2*a)
x2 = (0-b-math.sqrt(b*b-4*a*c))/(2*a)
return x1,x2
print("math解方程",fun(3,4,1))
#fun(3,4,5)不能对负数开方,即使是奇数次方
测试3,4,5还不行,就用a=3,b=4,c=1测试。
分数法
def functin(a,b,c):
x1 = Fraction((0-b+math.sqrt(b*b-4*a*c)),(2*a))
x2 = Fraction((0-b-math.sqrt(b*b-4*a*c)),(2*a))
return x1,x2
#both arguments should be Rational instances
#print(functin(3,4,1))
十进制法
def f(a,b,c):
x1 = Decimal(0-b+math.sqrt(b*b-4*a*c))/Decimal(2*a)
x2 = Decimal(0-b-math.sqrt(b*b-4*a*c))/Decimal(2*a)
return x1,x2
print("Decimal解方程",f(3,4,1))
sympy
from sympy import symbols, solve
def fsympy(a,b,c):
x = symbols('x')
print("sympy解方程",solve(a * x**2 + b*x + c, x))
fsympy(3,4,1)
验证
=================== RESTART: C:/Program Files/Python38/误差.py ===================
math解方程 (-0.3333333333333333, -1.0)
Decimal解方程 (Decimal(’-0.3333333333333333333333333333’), Decimal(’-1’))
sympy解方程 [-1, -1/3]
从结果来看用sympy最好。不过十进制方法里只把除法运算加了Decimal转换,里面的乘法和减法没有转换。
标签:误差,处理,Decimal,Fraction,print,十进制,math From: https://blog.csdn.net/denghai_csdn/article/details/143748691