gpt4 book ai didi

julia - 如何在 Julia 中测试特定数字有效数字的近似相等

转载 作者:行者123 更新时间:2023-12-02 02:04:11 30 4
gpt4 key购买 nike

Julia 中的 isapprox() 函数用于测试两个数字或数组是否近似相等。我希望能够测试任何所需数量的有效数字的近似相等性。正如下面的代码示例所示,近似值的公差要么以绝对值给出,要么以相对(百分比)偏差给出。

# Syntax
isapprox(a, b; atol = <absolute tolerance>, rtol = <relative tolerance>)

# Examples
# Absolute tolerance
julia> isapprox(10.0,9.9; atol = 0.1) # Tolerance of 0.1
true

# Relative tolerance
julia> isapprox(11.5,10.5; rtol = 0.1) # Rel. tolerance of 10%
true

julia> isapprox(11.4,10.5; rtol = 0.01) # Rel. tolerance of 1%
false

julia> isapprox(98.5, 99.4; rtol = 0.01) # Rel. tolerance of 1%
true

我在某个论坛上读到,设置rtol = 1e-n,其中n是有效数字的数量,将比较有效数字。 (不幸的是,我无法再次找到它。)无论如何,正如示例所示,这显然不是真的。

鉴于我们在这种情况下希望用两个有效数字近似相等,11.4 和 10.5 都近似等于 11。但是,两者之间的相对差异大于 1%,返回近似值 false。但是,对于任何大于 90 的数字,近似值为 true。将相对容差增加十倍到 10% 将导致灵敏度过低,如代码所示。

是否有一个参数/值/公式,我可以为 isapprox() 设置 rtol 来为任何所需数量的有效值正确返回 true数字?

最佳答案

简单的回答是rtol没有固定值,您可以选择保证isapprox(x, y; rtol=rtol) 将值 xy 与一定数量的有效数字进行比较。这是因为how isapprox is implemented :rtol 是相对于 norm(x)norm(y)最大值计算的。您必须为要比较的每对 xy 计算不同的 rtol

您所要求的似乎是一种将xy的值四舍五入与一定数量的有效值进行比较的方法数字(以 10 为基数)。 round方法有一个可能有用的关键字sigdigits:

isapproxsigfigs(a, b, precision) = round(a, sigdigits=precision) == round(b, sigdigits=precision)

isapproxsigfigs(10, 9.9, 1) # true, 10 == 10
isapproxsigfigs(10, 9.9, 2) # false, 10 != 9.9

isapproxsigfigs(11.4, 10.5, 1) # true, 10 == 10
isapproxsigfigs(11.4, 10.5, 2) # false, 11 != 10 (remember RoundingMode!)

isapproxsigfigs(11.4, 10.51, 1) # true, 10 == 10
isapproxsigfigs(11.4, 10.51, 2) # true, 11 == 11
isapproxsigfigs(11.4, 10.51, 3) # false, 11.4 != 10.5

对于第二个示例,请记住,如果将平局四舍五入,则 10.5 仅“接近 11”。默认RoundingMode Julia 使用的是 RoundNearest ,四舍五入为偶数。如果您希望将关系向上舍入,请使用 RoundNearestTiesUp :

isapproxsigfigs2(a, b, precision) = 
round(a, RoundNearestTiesUp, sigdigits=precision) ==
round(b, RoundNearestTiesUp, sigdigits=precision)

isapproxsigfigs2(11.4, 10.5, 2) # true, 11 == 11

关于julia - 如何在 Julia 中测试特定数字有效数字的近似相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68666525/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com