Java parsefloat 在每个 CPU 上都有相同的结果

Java parsefloat same result on every CPU

提问人:sveri 提问时间:10/30/2019 更新时间:10/30/2019 访问量:100

问:

我刚刚读到了 strictfp (https://en.wikipedia.org/wiki/Strictfp) 以及自 Java 1.2 以来浮点/双点运算可能会在不同的 CPU 上产生不同的结果这一事实。

现在我想知道方法是否也是如此? 我找不到任何来源。javadoc for 明确指出:Float.valueOfvalueOf

Note that the round-to-nearest rule also implies overflow and underflow behaviour;

对我来说,这表明如果关闭 strictfp,情况可能会有所不同。

是否有关于这个主题的确切消息来源,并指出情况是否如此?

Java 点浮 点精度

评论

0赞 Joop Eggen 10/30/2019
不使用 strictfp 允许使用芯片浮点支持,比如 10 字节 i.o. 8 字节用于中间计算。因此,可能会使用更好的精度,但生成的 4 字节浮点数可能不会有明显差异。不是 100% 确定。Float.valueOf

答:

4赞 Stephen C 10/30/2019 #1

对我来说,这表明如果关闭 strictfp,情况可能会有所不同。

JLS 表示,修饰符的含义是类或方法中的任何表达式都被计算为 FP-strict。strictfp

但是,JLS 并没有说,如果在 FP-strict 表达式中调用不同的方法,则该方法中的计算也会自动成为 FP-strict。

这意味着您从调用中获得的结果不依赖于调用方的 FP 严格程度。Float.valueOfstrictfp

另一方面,在以下位置进行转换的(内部)Java 类:Float.valueOf(String)

  • 注意对 INF 和 NaN 值使用特定值,
  • 注意确保该值在 javadoc 中规定的错误范围内,并且
  • 在这种情况下,它以算术进行转换。Floatdouble

但是,转换方法不是方法,因此如果代码对 FP 严格性敏感,那么就会有问题。strictfp

要查找的类在 Java 11 中。jdk.internal.math.FloatingDecimal