6

プログラミング言語/コンパイラの実装の観点から、ゼロ(C、PHP)への切り捨てではなく、マイナス無限大(Haskell 、Ruby)への切り捨てを使用する利点は何なのか疑問に思っていました。

マイナスの無限大に向かって切り詰めることは正しい方法のようですが、そのような主張の信頼できる情報源も、そのような決定がコンパイラの実装にどのように影響するかもわかりません。私は可能なコンパイラの最適化に特に興味がありますが、排他的ではありません。

関連ソース:

Haskell の除算

quotRem と divMod の違いが役立つのはいつですか?

4

3 に答える 3

5

これは、ISO/IEC 10967-1:2012言語に依存しない算術演算(vl. LIA-1) C.5.1.2.2 の附属書 C の (有益な) 根拠からの引用です。省略記号 ... 私が挿入しました。

... 2 つの丸め規則が一般的に使用されます。負の無限大( quot I )への丸めと、ゼロへの丸めです。後者は、引数の符号が異なる場合に誤って使用される傾向があるため、LIA-1 では指定されていません。例えば、

quot I (-3,2) = -2 負の無限大に向かって丸め、LIA-1 で指定

div t I (-3,2) = -1 ゼロに丸め、LIA のどの部分でも指定されなくなりました

quot I ... as ... はすべて、広く有用な翻訳不変条件を満たします。

   quot I ( x + i * y , y) = quot I ( x , y ) + i    if y ≠ 0で、オーバーフローが発生しない場合

... quot Iは、多くの数学者が好む整数除算の形式です。div t I (もはや LIA では指定されていません) は、Fortran によって導入された除算の形式です。

グループ化には、整数除算がよく使用されます。たとえば、一連のインデックス付きアイテムをn 個のアイテムのグループに分割する場合、 itemiを groupに入れるのが自然i/nです。quot Iが整数除算に使用されている場合、これは正常に機能します。ただし、div t I (LIA では指定されなくなりました) が使用され、i負になる可能性がある場合、グループ 0 は目的のnではなく2 ⋅ n -1 項目を取得します。この負の不均一な動作は、微妙なプログラム エラーを引き起こす可能性があり、div t I ...の使用に反対する強力な理由です。i

于 2013-11-13T16:04:58.080 に答える