在Julia中使用近似数比较的一个例子
近似相等的算法被考虑(≈)在Julia编程语言中,它允许您正确比较浮点数。
导言
在编程中使用浮点数时,由于这些数字在计算机内存中的表示精度有限,因此通常难以比较值。
例如,计算的结果 0.1 + 0.2 也许不完全相等 0.3. 为了正确检查两个这样的数字是否彼此接近,使用特殊近似相等方法。
在Julia语言中,函数负责这一点。 ≈ (或 isapprox()),它允许您在考虑可能的舍入误差的情况下比较值。 该机制广泛应用于科学计算、测试、数据处理等需要高精度比较的领域。
此示例演示运算符的工作方式。 ≈ 在不同的数字对集合上。
应用近似相等
让我们创建一个我们将比较的值对列表。
In [ ]:
testvalues = [
# 数字非常大的例子:
[100000000000000.01, 100000000000000.011], # 它们不同于小数点后的最后一位
# 中间顺序的数字:
[100.01, 100.011], # 它们的差异超过了误差范围
# 由于浮点数表示,结果可能不准确的除法运算:
[10000000000000.001 / 10000.0,
1000000000.0000001000], # 必须等于100000000000000.001/10000=100000000.0000001
# 非常小的正数:
[0.001, 0.0010000001], # 百万分之差
# 一个非常小的数字和零:
[0.000000000000000000000101, 0.0], # 它几乎是零吗?
# 数学上等表达式:
[sqrt(2) * sqrt(2), 2.0], # sqrt(2)^2=2,但是四舍五入的结果会发生什么?
# 用负数:
[-sqrt(2) * sqrt(2), -2.0], # 同样对于否定的情况
# 用不同数量的字符写的数字pi:
[3.14159265358979323846, 3.14159265358979324] # 它们相差一个小数位。
]
Out[0]:
比较数字
列表中的每对 testvalues 它被顺序取入并存储在变量中 (x, y).
接下来,将信息输出:
-值显示 x,右边补充了长度为21的空格;
-然后显示"≈"符号;
-价值 y,左边补充了长达22的空格;
-冒号后,显示应用运算符的结果。 ≈:真或假。
-这样我们可以立即看到哪些对被认为是近似相等的。
In [ ]:
# 循环遍历数组中的所有对(x,y)
for (x, y) in testvalues
# 我们输出将x≠y与值进行比较的结果
println(
rpad(x, 21), # 用右边的空格填充x,宽度为21
" ≈ ", # 近似相等的操作
lpad(y, 22), # 用左边的空格填充y,宽度为22
": ", # 逻辑结果之前的分隔符
x ≈ y # 调用函数≈(x,y)->Bool
)
end
操作员 ≈. 它是如何工作的?
操作员 ≈ 在Julia中,默认情况下,它相当于调用一个函数 isapprox(x, y) 使用以下公式:
哪里:
- (绝对公差):最小绝对误差;
- (relative tolerance):相对误差。
默认情况下,参数的定义如下:
atol = 0rtol = sqrt(eps()) ≈ 1.49e−8
有关该功能的详细资料,亦可在文件。
结论
在这个例子中,我们研究了Julia编程语言中近似相等机制的使用。
我们用了操作员 ≈ 来分析在机器算术不准确的背景下实数之间的差异。
借助此功能,您可以测试计算,对浮点数进行安全比较,以及处理需要容忍小错误的数据。
操作员工作的知识 ≈ 它对于在数学,物理建模和数据分析领域工作的程序员非常有用。
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Approximate_equality )