Oracle 仕様 - 第 5 章を確認してください。
この行:
拡大プリミティブ変換では、数値の全体的な大きさに関する情報が失われません。
の 2 行下に、マグニチュード情報が失われる可能性があることを示すこの行が続きます。
strictfp ではない float から double への拡張プリミティブ変換では、変換された値の全体的な大きさに関する情報が失われる可能性があります。
これは明らかな矛盾のように思えます。これは間違いですか?
Oracle 仕様 - 第 5 章を確認してください。
この行:
拡大プリミティブ変換では、数値の全体的な大きさに関する情報が失われません。
の 2 行下に、マグニチュード情報が失われる可能性があることを示すこの行が続きます。
strictfp ではない float から double への拡張プリミティブ変換では、変換された値の全体的な大きさに関する情報が失われる可能性があります。
これは明らかな矛盾のように思えます。これは間違いですか?
はい、そうです。オラクル より:
こんにちはビル、
メールしてくれてありがとう。以下の間に矛盾があることに同意します。
「拡大プリミティブ変換では、数値の全体的な大きさに関する情報が失われません。」
と:
「厳密な fp ではない float から double への拡張プリミティブ変換では、変換された値の全体的な大きさに関する情報が失われる可能性があります。」
strictfp が導入される前の JLS の初版には、最初の文のみが記載されていました。2 番目の文は、strictfp サポートの一部として JLS の第 2 版に記載されており、最初の文は同時に変更されているはずです。Java SE 8 Edition では、一部の拡張プリミティブ変換のみが大きさの情報を失わないことを明確にします。
価値のあるものとして、JVM 仕様は2.11.4の文言で少し明確になっています。
拡大数値変換では、数値の全体的な大きさに関する情報が失われません。実際、int から long および int から double に拡大する変換では、情報がまったく失われません。数値は正確に保持されます。FP 厳密 (§2.8.2) である float から double への拡大変換も、数値を正確に保持します。ただし、FP 厳密ではない変換では、変換された値の全体的な大きさに関する情報が失われる可能性があります。
以上の説明です。float から double への変換という特定のケースでは、 strictfpが指定されていない限り、情報が失われないという保証はありません。