【问题标题】:JLS appears to contradict itselfJLS 似乎自相矛盾
【发布时间】:2013-10-01 13:19:17
【问题描述】:

请查看Oracle Specification - Chapter 5

这一行:

扩展原语转换不会丢失有关 数值的总大小。

紧随其后,仅以下 2 行,此行表示幅度信息 可能会丢失。

从浮点数到双精度数的扩展原始转换不是 strictfp 可能会丢失有关 换算值。

这似乎是一个明显的矛盾;这是一个错误吗?

【问题讨论】:

  • stackoverflow.com/questions/1293819/… 也回答了这个问题
  • 也许第一行应该读作“一般扩大基元转换不会...”,第二行是一个特例。
  • 好吧,那么这是一个错误。它应该。但事实并非如此。
  • @nativist.bill.cutting 所以向 Oracle 提出问题。
  • 有人可以提供这种类型的转换,它会丢失震级信息。

标签: java jls


【解决方案1】:

是的,确实如此。来自神谕:

嗨,比尔,

感谢您的来信。我同意两者之间存在矛盾:

“扩大的基元转换不会丢失有关 数值的总大小。”

和:

"从浮点数到双精度数的扩展原始转换不是 strictfp 可能会丢失有关 换算值。”

JLS 第一版中只出现了第一句话, 在引入 strictfp 之前。第二句话出现在 JLS 的第二版,作为 strictfp 支持的一部分,以及 第一句应该同时修改。在爪哇 SE 8 版,我会澄清,只有一些拓宽原语 转换不会丢失幅度信息。

【讨论】:

    【解决方案2】:

    对于它的价值,JVM 规范在2.11.4 的措辞中更加清晰:

    扩大数值转换不会丢失有关数值整体大小的信息。实际上,从 int 扩大到 long 和从 int 扩大到 double 的转换根本不会丢失任何信息;数值被完全保留。 FP-strict(第 2.8.2 节)从 float 扩大到 double 的转换也完全保留了数值; 但是,此类非 FP 严格的转换可能会丢失有关转换值的整体大小的信息。

    【讨论】:

    • ...我相信这也是错误的,但是 b.c.现在有两个参考文献,我要问语言学家或英语教授。也许我对英语的理解不正确,但是说Widening numeric conversions do not lose information about the overall magnitude of a numeric value. ...然后说除了在这种特定情况下,我认为在逻辑上是错误的,但更重要的是,如果你在读到最后一句话之前就退出阅读,则会产生误导。
    • @nativist.bill.cutting 我认为这是假设读者理解非严格的 fp 操作通常会导致“错误”,并且第一句话仅适用于“格式良好”的转换(即 FP 严格)。但我同意你的说法,措辞很糟糕。
    【解决方案3】:

    这更像是一个澄清。在浮点到双精度转换的特定情况下,除非指定了 strictfp,否则无法保证不会丢失信息

    【讨论】:

    • 但这仍然与之前的说法相矛盾。
    • 如果你要分头发,是的。它们在文档中直接相邻的事实意味着它们在一起,其中一个是对另一个特定实例的澄清。这就像说夏天所有的草坪都是绿色的。如果它变得太热,那么除非得到适当的照顾,否则它可能不会变绿。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多