floating-point - OCaml 如何管理 float 加法?

标签 floating-point ocaml

在 Java 中,如果您执行 0.2 + 0.01,您将得到 0.21000000000000002

这是由于IEEE 754

但是,在 OCaml 中,如果您执行 0.2 +。 0.01,那么你得到正确的结果 0.21

我认为 OCaml 也遵守 IEEE 754 的 float ,为什么 OCaml 可以给出正确的结果而 Java 不能?

最佳答案

在这种情况下,哪一个是“正确的”?从浮点运算的角度来看,Java在这里是正确的。无论如何,

OCaml toplevel 中的值由 genprintval.ml 打印,float 值由 print_float 打印,它使用 string_of_float 。它的定义在pervasives.ml中:

let string_of_float f = valid_float_lexem (format_float "%.12g" f)

如您所见, float 是使用 printf 格式“%.12g”打印的。小于 10^{-12} 的东西会被简单地丢弃。这就是您看到“不正确”答案 0.21 的原因。如果提高精度,您将获得与 Java 相同的输出:

# Printf.sprintf "%.20g" (0.2 +. 0.01);;
- : string = "0.21000000000000002"

关于floating-point - OCaml 如何管理 float 加法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488387/

相关文章:

c++ - 从字符串中读取精度高达 6 的浮点值

assembly - 将 FASM 中的 80 位 float 与给定精度进行比较

ocaml - 使 menhir 添加用户定义的函数从 .mly 到 .mli

types - OCaml 类型/模块

ocaml - 想法在类型中工作

c - 从字符数组进行浮点检查以进行限制,字符检查正面和背面

java - Double.isNaN() 是如何工作的?

python - 尝试使用 python boto 库插入 float 时出现 DynamoDBNumberError

javascript - ReasonML访问JS记录字段

ocaml - 多态变体子类型实现与签名不匹配