Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何解决“基本”中的舍入错误;“混沌理论”;程序_Python_Precision - Fatal编程技术网

Python:如何解决“基本”中的舍入错误;“混沌理论”;程序

Python:如何解决“基本”中的舍入错误;“混沌理论”;程序,python,precision,Python,Precision,我从Zelle对Python的介绍中学习了Python,并遇到了下面的一个基本程序示例,该程序基于初始输入模拟混沌输出 def main(): print("This program illustrates a chaotic function") x = eval(input("Enter a number between 0 and 1: ")) for i in range(10): x = 3.9 * x * (1 - x)

我从Zelle对Python的介绍中学习了Python,并遇到了下面的一个基本程序示例,该程序基于初始输入模拟混沌输出

 def main():
     print("This program illustrates a chaotic function")
     x = eval(input("Enter a number between 0 and 1: "))
     for i in range(10):
         x = 3.9 * x * (1 - x)
         print(x)

main()

This program illustrates a chaotic function

Enter a number between 0 and 1: .15
0.49724999999999997
0.97497050625
0.09517177095121285
0.3358450093643686
0.8699072422927216
0.4413576651876355
0.9615881986142427
0.14405170611022783
0.48087316710014555
0.9735732406265619
我知道,对于Python中默认的双精度浮点数据类型,这种舍入错误是不可避免的。例如,第一个输出值正好是0.49725。我从某个地方读到,舍入错误可以通过使用Python的十进制库中的十进制函数来解决。所以我稍微修改了程序:

from decimal import Decimal

def main():
    print("This program illustrates a chaotic function")
    x = Decimal(eval(input("Enter a number between 0 and 1: ")))
    for i in range(10):
        x = Decimal(Decimal(3.9) * x * (Decimal(1) - x))
        print(x)

main()

This program illustrates a chaotic function

Enter a number between 0 and 1: .15
0.4972499999999999735211808627
0.9749705062499999772282405220
0.09517177095121305485295678083
0.3358450093643692781451067085
0.8699072422927223412528927684
0.4413576651876335014022344487
0.9615881986142417803060044330
0.1440517061102311988874201782
0.4808731671001548246798042829
0.9735732406265634386141115723

有没有办法解决这个问题,使精确的输出值(如0.49725)能够精确地表示?这样的问题是如何处理的?

这个问题来自您正在使用的中间步骤:
eval
调用(这并不是将用户输入解析为浮点值的最佳方法,
float
函数更安全)。这将评估用户对Python解释器本机解析为的内容的输入,在本例中为浮点。这意味着当您执行
Decimal(eval(input())
时,在将数据传递给
Decimal
之前,您已经干扰了该数据,该数据仅适用于给定的数据。删除
eval
调用,让
Decimal
本身处理用户的输入。此外,您还必须清除所有其他本机浮点,例如
Decimal(3.9)
,在创建
Decimal
之前,先从3.9中创建一个浮点。通过将字符串传递到
十进制
,可以避免这种情况

>>> Decimal(Decimal(3.9) * Decimal(eval('.15')) * (Decimal(1) - Decimal(eval('.15'))))
Decimal('0.4972499999999999735211808627')
>>> Decimal(Decimal(3.9) * Decimal(.15) * (Decimal(1) - Decimal(.15)))
Decimal('0.4972499999999999735211808627')
>>> Decimal(Decimal(3.9) * Decimal('.15') * (Decimal(1) - Decimal('.15')))
Decimal('0.4972499999999999886757251488')
>>> Decimal(Decimal('3.9') * Decimal('.15') * (Decimal('1') - Decimal('.15')))
Decimal('0.49725')

问题来自您正在使用的中间步骤:
eval
调用(这不是将用户输入解析为浮点值的最佳方法,
float
函数更安全)。这将评估用户对Python解释器本机解析为的内容的输入,在本例中为浮点。这意味着当您执行
Decimal(eval(input())
时,在将数据传递给
Decimal
之前,您已经干扰了该数据,该数据仅适用于给定的数据。删除
eval
调用,让
Decimal
本身处理用户的输入。此外,您还必须清除所有其他本机浮点,例如
Decimal(3.9)
,在创建
Decimal
之前,先从3.9中创建一个浮点。通过将字符串传递到
十进制
,可以避免这种情况

>>> Decimal(Decimal(3.9) * Decimal(eval('.15')) * (Decimal(1) - Decimal(eval('.15'))))
Decimal('0.4972499999999999735211808627')
>>> Decimal(Decimal(3.9) * Decimal(.15) * (Decimal(1) - Decimal(.15)))
Decimal('0.4972499999999999735211808627')
>>> Decimal(Decimal(3.9) * Decimal('.15') * (Decimal(1) - Decimal('.15')))
Decimal('0.4972499999999999886757251488')
>>> Decimal(Decimal('3.9') * Decimal('.15') * (Decimal('1') - Decimal('.15')))
Decimal('0.49725')

一个次要的后续问题-是否也可以使用Numpy float64或Numpy double解决浮点舍入误差复合的问题?一句话:对于金融计算之类的东西,我很清楚,默认的float类型不是最好的。数据类型decimal、np.float64和np.double是否可以安全地用于此类计算?@u23-这些都是IEEE 754二进制浮点数。金融计算使用整数(例如,表示便士而不是美元)。一个次要的后续问题-是否也可以使用Numpy float64或Numpy double解决浮点舍入误差复合的问题?一句话:对于金融计算之类的东西,我很清楚,默认的float类型不是最好的。数据类型decimal、np.float64和np.double是否可以安全地用于此类计算?@u23-这些都是IEEE 754二进制浮点数。财务计算使用整数(例如,表示便士而不是美元)。