该程序中是否存在精度错误?

时间:2016-11-13 13:19:01

标签: python math

我试图验证一笔金额而且在该程序中我似乎找不到0,是否有错误?

from mpmath import *
mp.dps = 1500

a=mpf(0.1)
p=mpf(2.)

def f1(x):
  return (a-(mpf(1)-mp.sqrt(1-x**2)))**p*x

def f2(x):
  return x*(x-a)**p

def f3(x):
  return x**p

i=mp.quad(f1,[0,mp.sqrt(mpf(1)-mpf(0.9)**mpf(2))])
j=mp.quad(f2,[0,a])
k=mp.quad(f3,[0,a])

print i,j,k
print mp.fabs(i)+mp.fabs(j)-mp.fabs(k)

即使有1500位数字,我也找不到0。

1 个答案:

答案 0 :(得分:1)

当您从Python float创建mpf实例时,您在代码中输入的值首先转换为53位值,然后转换为高精度值。您正在处理的不是您期望的值。

如果您正在使用高精度代码,则应该从字符串或整数初始化。请尝试以下方法:

from mpmath import *
mp.dps = 1500

a=mpf("0.1")
p=mpf(2)

def f1(x):
  return (a-(mpf(1)-mp.sqrt(1-x**2)))**p*x

def f2(x):
  return x*(x-a)**p

def f3(x):
  return x**p

i=mp.quad(f1,[0,mp.sqrt(mpf(1)-mpf("0.9")**mpf(2))])
j=mp.quad(f2,[0,a])
k=mp.quad(f3,[0,a])

print i,j,k
print mp.fabs(i)+mp.fabs(j)-mp.fabs(k)