この比較印刷は'0'b
を印刷します。理由を理解できない...私が知っているように、必要に応じてPL/Iの文字列は自動的にfloat
に変換されます。なぜ私が疑うように比較が機能しないのですか? PL/I
put skip list('-2.34e-1'=-2.34e-1);
この比較印刷は'0'b
を印刷します。理由を理解できない...私が知っているように、必要に応じてPL/Iの文字列は自動的にfloat
に変換されます。なぜ私が疑うように比較が機能しないのですか? PL/I
put skip list('-2.34e-1'=-2.34e-1);
私は、私たちの環境でこれをテストした(z/OS上のEnterprise PL/IのV4.5)と同じ動作を発見した - 特定のコンパイルオプションの下で。オプションFLOAT(NODFP)
を使用して
(すなわち10進浮動小数点のネイティブサポートを使用していない、私はオプションはエンタープライズPL/I V4.4で導入されたと思います)、次の問題が発生した:
-2.34e-1
が変換され、 bin float(6)
としてその内部表現、すなわち短い2進浮動小数点へ'-2.34e-1'
はbin float(6)
値と比較されるので、以降もbin float
に変換されなければなりませんは、バイナリ分数としての正確な表現を持っていません。これはコンパイラがそれをbin float(54)
に変換した、つまり拡張バイナリ浮動小数点値で最大の精度を得ると思われます。-0.234
のバイナリ表現の小数点以下の桁数は無制限ですが、変換された2つの値は異なる桁数を保持しているため、値は等しく比較されません。 FLOAT(DFP)
下(すなわち機械DFPサポートを使用する場合)
-2.34e-1
の内部表現は、実際の10進浮動小数点であり、したがって'-2.34e-1'
'1'b
あなたの問題は、異なる精度のバイナリ浮動小数点を使用することから、データ表現とその結果生じる丸め誤差の異なる選択肢の組み合わせです。
これは、浮動小数点値の等価性比較の落とし穴の1つを示しています。 @ piet.tテストコンパイルを実行していただきありがとうございます。万が一、LISTオプションをオンにして、生成されたコードを見ましたか? – zarchasmpgmr
ありがとうございました!問題は複雑になりました。私は答えがずっと簡単だと思った。 –
期待していた出力は何ですか?エミュレータが貼り付けられた出力のように正確ですか? –
@BillWoodger私は '1'bを期待していた –
あなたの環境は?ヘラクレスのPL1F? PL/I最適化コンパイラ?古代デジタル研究CP/M 80コンパイラのようなPL/1のもう一つの実装? – zarchasmpgmr