当前位置: 首页 > 面试题库 >

浮点数和小数的小数位问题。

奚昌胤
2023-03-14
问题内容

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

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

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)配合使用。

有任何想法吗?


问题答案:

我对Decimal类还不够熟悉,无法为您提供帮助,但是您的问题是由于以下事实导致:十进制小数通常无法以二进制形式精确表示,因此您所看到的是最接近的近似值。如果不使用特殊的类(例如,十进制),就无法避免此问题。

EDIT:十进制类对您来说不能正常工作呢?只要我以字符串而不是浮点数开头,幂似乎就可以正常工作。

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

该模块文档解释了需要和使用decimal.Decimal非常清楚,你应该检查出来,如果你还没有。



 类似资料:
  • 我对编程很陌生,在大学里我们学习了不同类型的数字(整数、短数、浮数、双数)。Float和double是浮点数。通常,它们由一个符号+/-、一个尾数和一个指数组成。每个部分占用一定数量的比特。一个浮动最多可以显示小数点后7位,最多可以双倍显示16位。其公式是: 23·log10(2)=23·(log(2)/log(10))≈23·0.3≈7(浮点数小数点后) 52·0.3≈16(双人小数点后) 我知

  • 问题内容: 我的表中有以下列表。 我怎样才能得到小数点后的位数。 重复?: 我已经检查了现有的帖子,但是没有正确的方法来处理 数字 。 结果 编辑 :花了一些宝贵的时间后,我发现了一些相对简单的脚本来处理此问题。 问题答案: 我找到了一些简单的脚本(相对于我而言)来处理此问题。 此处仅用于处理不带小数部分的浮点数。如果没有没有小数部分的值,那么这很简单 希望对您有帮助。完整脚本如下

  • 在编程语言中,小数通常以浮点数的形式存储。浮点数和定点数是相对的:小数在存储过程中如果小数点发生移动,就称为浮点数;如果小数点不动,就称为定点数。 如果你对浮点数的底层存储格式不了解,请猛击:小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文) Python 中的小数有两种书写形式: 1) 十进制形式 这种就是我们平时看到的小数形式,例如 34.6、346.0、0.346。 书写小数时必须

  • 问题内容: 我想四舍五入为。 该功能无法按我预期的方式工作。 问题答案: 你遇到了浮点数的老问题,不是所有的数字都能精确地表示。命令行只是向你显示内存中的完整浮点形式。 对于浮点表示,舍入的版本是相同的数字。由于计算机是二进制的,它们将浮点数存储为整数,然后除以2的幂,因此将以类似于的方式表示。 双精度数字有53位(16位)的精度,而常规浮点数有24位(8位)的精度。Python中的浮点类型使用双

  • 我面临以下问题/行为: 这是什么导致的?大数/浮动的小数位有限制吗? 它是否与IEEE 754标准相关(如本文所述:浮点数学是否被破坏?)? 最后——我该如何解决这个问题?

  • 问题内容: 哪种类型(浮点型或十进制)最适合将价格存储在mysql数据库中? 问题答案: 浮点数不精确,可能会导致累积舍入误差。十进制是必须准确的财务信息的最佳格式。