浮点数和小数点的小数位问题.十进制 [英] Decimal place issues with floats and decimal.Decimal

查看:29
本文介绍了浮点数和小数点的小数位问题.十进制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎在使用浮点数时失去了很多精度.

I seem to be losing a lot of precision with floats.

例如我需要求解一个矩阵:

For example I need to solve a matrix:

4.0x -2.0y 1.0z =11.0
1.0x +5.0y -3.0z =-6.0
2.0x +2.0y +5.0z =7.0

这是我用来从文本文件中导入矩阵的代码:

This is the code I use to import the matrix from a text file:

f = open('gauss.dat')
lines =  f.readlines()
f.close()

j=0
for line in lines:
    bits = string.split(line, ',')
    s=[]
    for i in range(len(bits)):
        if (i!= len(bits)-1):
            s.append(float(bits[i]))
            #print s[i]
    b.append(s)
    y.append(float(bits[len(bits)-1]))

我需要使用 gauss-seidel 求解,所以我需要重新排列 x、y 和 z 的方程:

I need to solve using gauss-seidel so I need to rearrange the equations for x, y, and z:

x=(11+2y-1z)/4
y=(-6-x+3z)/5
z=(7-2x-2y)/7

这是我用来重新排列方程式的代码.b 是系数矩阵,y 是答案向量:

Here is the code I use to rearrange the equations. b is a matrix of coefficients and y is the answer vector:

def equations(b,y):
    i=0
    eqn=[]
    row=[]
    while(i<len(b)):
        j=0
        row=[]
        while(j<len(b)):
            if(i==j):
                row.append(y[i]/b[i][i])
            else:
                row.append(-b[i][j]/b[i][i])
            j=j+1
        eqn.append(row)
        i=i+1
    return eqn

但是我得到的答案并不精确到小数位.

However the answers I get back aren't precise to the decimal place.

例如,从上面重新排列第二个等式后,我应该得到:

For example, upon rearranging the second equation from above, I should get:

y=-1.2-.2x+.6z

我得到的是:

y=-1.2-0.20000000000000001x+0.59999999999999998z

这似乎不是一个大问题,但是当您将数字提高到非常高的幂时,错误会非常大.有没有解决的办法?我尝试了 Decimal 类,但它不适用于幂(即 Decimal(x)**2).

This might not seem like a big issue but when you raise the number to a very high power the error is quite large. Is there a way around this? I tried the Decimal class but it does not work well with powers (i.e, Decimal(x)**2).

有什么想法吗?

推荐答案

我对 Decimal 类不够熟悉,无法帮助您解决问题,但您的问题是由于小数通常无法准确表示二进制,所以你看到的是最接近的近似值;如果不使用特殊类(可能是 Decimal),就无法避免这个问题.

I'm not familiar enough with the Decimal class to help you out, but your problem is due to the fact that decimal fractions can often not be accurate represented in binary, so what you're seeing is the closest possible approximation; there's no way to avoid this problem without using a special class (like Decimal, probably).

那么小数类不能正常工作怎么办?只要我从字符串而不是浮点数开始,power 似乎就可以正常工作.

What about the decimal class isn't working properly for you? As long as I start with a string, rather than a float, powers seem to work fine.

>>> import decimal
>>> print(decimal.Decimal("1.2") ** 2)
1.44

模块文档解释了 decimal.Decimal 的必要性和用法很清楚,如果你还没有,你应该检查一下.

The module documentation explains the need for and usage of decimal.Decimal pretty clearly, you should check it out if you haven't yet.

这篇关于浮点数和小数点的小数位问题.十进制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆