我正在学习Jason对目标Caml的介绍。
上面写着
Matching against floating-point values is supported, but it is rarely used because of numerical issues
好的,我们不能匹配浮点值。
,如果我们需要怎么办?那怎么做呢?
发布于 2012-12-12 21:54:05
要扩展以前的答案,可以使用模式匹配和浮点数,如下面的示例所示:
# let float_match_example = function
| 0. -> "exact zero"
| x when abs_float x < 1e-12 -> "epsilon"
| _ -> "other";;
val float_match_example : float -> string = <fun>
# List.map float_match_example [0.; 42e-15; 3.];;
- : string list = ["exact zero"; "epsilon"; "other"]只是要小心模式匹配隐式地使用相等测试,这在处理浮点数时很少是想要的:当舍入错误累积时,两个浮点数很少完全相等。因此,您可以在关键字卫兵中使用when,如上面的代码所示。
发布于 2012-12-12 21:13:08
你可以匹配浮点数,它只是说它很少使用。
它很少被使用,因为可能会出现精度问题。如果你有两个数字,x和y:
x = 0.000000001
y = 0.0000000009X和y是一样的吗?那得看情况了。如果x和y是计算结果,那么累积四舍五入可以解释两者的差异,它们可能是相同的。
更粗略地说,浮点比较通常是“足够接近”,因此模式匹配很少使用它们作为精确匹配,可以排除经常需要的“足够接近”的匹配。
发布于 2012-12-12 21:13:22
您可以编写带有助手函数的图案护卫,以检查是否相等,或者使用一些epsilon或其他条件。
https://stackoverflow.com/questions/13848706
复制相似问题