给定以下等式:
x / y = z
其中
x
的精度为5,z
的精度为8,给定以下x
,y
的值:
from decimal import Decimal
x = Decimal('15.00000')
y = Decimal('81.63')
x_prec = 5
z_prec = 8
z_unrounded = x / y # 0.1837559720690922454979786843...
z = round(z_unrounded, z_prec) # 0.18375597
生成
0.18375597
的z
值,当乘以y
时给出14.9999998311
的值。
给定 x 的精度,我们可以将
z
的值“最大化”为 0.18375603
,因为:
z_max = Decimal('0.18375603')
x_unrounded = y * z_max # 15.0000047289
x = round(x_unrounded, x_prec) # 15.00000
我知道我可以在循环中找到这个
z_max
值:
extra_z = Decimal('0.0')
min_z = Decimal('0.00000001')
while True:
next_z = z + extra_z + min_z
if round(y * next_z, x_prec) > x:
break
extra_z += min_z
extra_z # 0.00000006
max_z = z + extra_z # 0.18375603
但是使用这种方法感觉不对,或者至少我缺少一些关于精度和
Decimal
值的关键见解。
是否有更清晰或更代数的计算方法
max_z
?
你在谈论重要的数字。 Wiki 上有很多信息。
如果 x=1.0 和 y=1.0,它们都有 2 个有效数字,并且您想找到 z 的最大允许范围,那么检查有效数字 x 的限制就足够了。在这种情况下,范围是从 0.95 到 1.049999。这两个值是 x_prec = 2 的极限,并且都将四舍五入为 1.0。
一般来说,两个数的乘积精度是两个因子的最小精度。对于第一个近似值(双关语),请查看维基百科关于 significant figures 的内容。要获得完全通用的答案,请查看 error analysis 的数学领域。在您的特定情况下,
x
和 y
的最小精度为 5
(来自 x
),因此它们的商也具有精度 5
– 在您的情况下为 0.18375
.