所以我决定尝试通过编写一些python脚本来解决我的物理作业来为我解决问题.我遇到的一个问题是,重要的数字似乎并不总能正常出现.例如,它可以正确处理重要数字:
from decimal import Decimal >>> Decimal('1.0') + Decimal('2.0') Decimal("3.0")
但这不是:
>>> Decimal('1.00') / Decimal('3.00') Decimal("0.3333333333333333333333333333")
所以有两个问题:
我是对的,这不是预期的有效数字量,还是我需要刷数字数字?
有没有办法做到这一点,而无需手动设置小数精度?当然,我确信我可以使用numpy来做到这一点,但我只是想知道是否有一种方法可以用好奇心来处理十进制模块.
Fredrik Joha.. 8
将小数点工作精度更改为2位数不是一个好主意,除非您绝对只执行单个操作.
您应始终以高于重要性水平的精度执行计算,并且仅围绕最终结果.如果执行长序列计算并四舍五入到每一步的有效位数,则会累积错误.十进制模块不知道任何特定操作是长序列中的一个还是最终结果,因此它假定它不应该超过必要的舍入.理想情况下它会使用无限精度,但这太贵了,因此Python开发人员确定了28位数.
一旦你到达最终结果,你可能想要的是量化:
>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001")) Decimal("0.333")
您必须手动跟踪重要性.如果要进行自动重要性跟踪,则应使用区间运算.有一些可用于Python的库,包括pyinterval和mpmath(它支持任意精度).使用十进制库实现区间运算也很简单,因为它支持有向舍入.
您可能还想阅读十进制算术常见问题:十进制算术'重要'算术?
将小数点工作精度更改为2位数不是一个好主意,除非您绝对只执行单个操作.
您应始终以高于重要性水平的精度执行计算,并且仅围绕最终结果.如果执行长序列计算并四舍五入到每一步的有效位数,则会累积错误.十进制模块不知道任何特定操作是长序列中的一个还是最终结果,因此它假定它不应该超过必要的舍入.理想情况下它会使用无限精度,但这太贵了,因此Python开发人员确定了28位数.
一旦你到达最终结果,你可能想要的是量化:
>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001")) Decimal("0.333")
您必须手动跟踪重要性.如果要进行自动重要性跟踪,则应使用区间运算.有一些可用于Python的库,包括pyinterval和mpmath(它支持任意精度).使用十进制库实现区间运算也很简单,因为它支持有向舍入.
您可能还想阅读十进制算术常见问题:十进制算术'重要'算术?