首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OCaml中浮点值匹配的替代方法是什么?

OCaml中浮点值匹配的替代方法是什么?
EN

Stack Overflow用户
提问于 2012-12-12 21:10:34
回答 4查看 346关注 0票数 1

我正在学习Jason对目标Caml的介绍

上面写着

Matching against floating-point values is supported, but it is rarely used because of numerical issues

好的,我们不能匹配浮点值。

,如果我们需要怎么办?那怎么做呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-12 21:54:05

要扩展以前的答案,可以使用模式匹配和浮点数,如下面的示例所示:

代码语言:javascript
运行
复制
# 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,如上面的代码所示。

票数 3
EN

Stack Overflow用户

发布于 2012-12-12 21:13:08

你可以匹配浮点数,它只是说它很少使用。

它很少被使用,因为可能会出现精度问题。如果你有两个数字,x和y:

代码语言:javascript
运行
复制
 x = 0.000000001
 y = 0.0000000009

X和y是一样的吗?那得看情况了。如果x和y是计算结果,那么累积四舍五入可以解释两者的差异,它们可能是相同的。

更粗略地说,浮点比较通常是“足够接近”,因此模式匹配很少使用它们作为精确匹配,可以排除经常需要的“足够接近”的匹配。

票数 4
EN

Stack Overflow用户

发布于 2012-12-12 21:13:22

您可以编写带有助手函数的图案护卫,以检查是否相等,或者使用一些epsilon或其他条件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13848706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档