所以我决定尝试写一些Python脚本,以解决问题为我解决我的物理作业。 我正在运行到一个问题是显著数字并不似乎总是正确出来。 例如,这妥善处理显著的数字:
from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")
但这并不:
>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")
所以两个问题:
- 我说得对,这是不是显著数字的预期数额,或者我需要刷上显著位数学?
- 有没有办法做到这一点,而无需手动设置小数精度? 当然,我敢肯定,我可以用numpy的做到这一点,但我只是想知道是否有一种方法与十进制模块出于好奇做到这一点。
更改十进制工作精度2位,是不是一个好主意,除非你绝对只是要执行一个操作。
你应该总是在比显着性水平更高的精度进行计算,只有轮的最终结果。 如果执行计算和轮的每一步显著的位数的长序列,误差会积累。 十进制模块不知道任何特定的操作是否是在一个很长的序列,或最终结果,因此它假定它不应该全面超过必要的。 理想情况下,将使用无限的精度,但就是太贵所以Python开发人员解决了28位。
一旦你最终的结果到了,你可能想要的是量化:
>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001"))
Decimal("0.333")
你必须手动跟踪的意义。 如果你想自动跟踪的意义,你应该使用区间算术。 有一些可用的库用于Python,包括pyinterval和mpmath (支持任意精度)。 这也是直接实现区间运算与小数库,因为它支持的舍入。
您可能还希望阅读十进制算术常见问题:是十进制算术“意义”算术?
小数不会扔掉小数位这样的。 如果你真的想精确度限制在2 DP再试试
decimal.getcontext().prec=2
编辑:您也可以调用量化()每次乘或除(加法和减法将保留2个DPS)的时间。
只是出于好奇...是有必要使用十进制模块? 为什么不带数字的显著-数字四舍五入浮点当你愿意看到他们? 或者是你想跟踪计算的显著数字(如果你要做一个结果的误差分析一样,计算计算的误差为进入计算的不确定性的一个功能)? 如果您希望从四舍五入的数量,而不是右边的左边四舍五入功能,请尝试:
def lround(x,leadingDigits=0):
"""Return x either as 'print' would show it (the default)
or rounded to the specified digit as counted from the leftmost
non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033
"""
assert leadingDigits>=0
if leadingDigits==0:
return float(str(x)) #just give it back like 'print' would give it
return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format
当您打印或将它们转换为字符串的数字会看的权利,但如果你在提示符下工作,并没有明确地打印出来,他们可能看起来有点奇怪:
>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4))
(0.33000000000000002, '0.33', '0.3333')
小数默认为精度28位。
限制它返回的位数的唯一方法是通过改变精度。
如果我正确undertand小数,“精准”是数字十进制小数点后的位数。
你似乎想别的东西:的显著位数。 这是比数字在科学记数法小数点后的数目多一个。
我有兴趣了解一个Python模块,做显著-数字感知浮点浮点计算。
这有什么错浮点?
>>> "%8.2e"% ( 1.0/3.0 )
'3.33e-01'
它被设计为科学式计算用的显著位数量有限。