在 Python 中基于精度最大化乘数

问题描述 投票:0回答:2

给定以下等式:

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

python decimal rounding
2个回答
0
投票

你在谈论重要的数字。 Wiki 上有很多信息。

如果 x=1.0 和 y=1.0,它们都有 2 个有效数字,并且您想找到 z 的最大允许范围,那么检查有效数字 x 的限制就足够了。在这种情况下,范围是从 0.95 到 1.049999。这两个值是 x_prec = 2 的极限,并且都将四舍五入为 1.0。


0
投票

一般来说,两个数的乘积精度是两个因子的最小精度。对于第一个近似值(双关语),请查看维基百科关于 significant figures 的内容。要获得完全通用的答案,请查看 error analysis 的数学领域。在您的特定情况下,

x
y
的最小精度为
5
(来自
x
),因此它们的商也具有精度
5
– 在您的情况下为
0.18375
.

© www.soinside.com 2019 - 2024. All rights reserved.