Проблемы с десятичным знаком с плавающей запятой и десятичной дробью.

Я, кажется, теряю много точности с поплавками.

Например мне нужно решить матрицу:

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

Это код, который я использую для импорта матрицы из текстового файла:

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:

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

Вот код, который я использую для перестановки уравнений.b является матрицей коэффициентов иy является вектором ответа:

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

Однако ответы, которые я получаю, не являются точными с точностью до десятичного знака.

Например, после перестановки второго уравнения сверху, я должен получить:

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

Что я получаю это:

y=-1.2-0.20000000000000001x+0.59999999999999998z

Это может показаться не большой проблемой, но когда вы увеличиваете число до очень высокой мощности, ошибка довольно велика. Это можно обойти? Я попробовалDecimal класс, но он плохо работает с полномочиями (т.е.Decimal(x)**2).

Есть идеи?

Ответы на вопрос(1)

Ваш ответ на вопрос