2017-01-19 3 views
1

この比較印刷は'0'bを印刷します。理由を理解できない...私が知っているように、必要に応じてPL/Iの文字列は自動的にfloatに変換されます。なぜ私が疑うように比較が機能しないのですか? PL/I

put skip list('-2.34e-1'=-2.34e-1); 
+1

期待していた出力は何ですか?エミュレータが貼り付けられた出力のように正確ですか? –

+0

@BillWoodger私は '1'bを期待していた –

+0

あなたの環境は?ヘラクレスのPL1F? PL/I最適化コンパイラ?古代デジタル研究CP/M 80コンパイラのようなPL/1のもう一つの実装? – zarchasmpgmr

答えて

3

私は、私たちの環境でこれをテストした(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
です

あなたの問題は、異なる精度のバイナリ浮動小数点を使用することから、データ表現とその結果生じる丸め誤差の異なる選択肢の組み合わせです。

+0

これは、浮動小数点値の等価性比較の落とし穴の1つを示しています。 @ piet.tテストコンパイルを実行していただきありがとうございます。万が一、LISTオプションをオンにして、生成されたコードを見ましたか? – zarchasmpgmr

+0

ありがとうございました!問題は複雑になりました。私は答えがずっと簡単だと思った。 –

関連する問題