【仕様】64ビット版における0.5の「丸め」処理について

Go down

【仕様】64ビット版における0.5の「丸め」処理について

投稿 by miyako on 2017-12-11, 4:15 pm

15R4/v16以降,64ビット版のコンパイラーは,実数の「丸め」処理に対してIntelのCPU命令を出力するようになりました。

IntelのCPU命令は,いわゆる「四捨五入」とは違い,「x.5」という値を交互に切り上げたり切り下げたります。

例:

0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4

これは,値を加算したときに発生する誤差を抑えるための処置です。

上述の例で言えば,「丸め」処理をしてもしなくても,結果は「8」となります。対照的に,四捨五入では合計値が1+2+3+4=10となります。

これは,IntelのCPU命令の仕様であり,したがってコンパイルモード特有の動作ですが,64ビット版の4Dでは,両モードの動きを揃えるため,インタープリターモードであっても同じ方法で「丸め」処理が実行されます。なお,32ビット版では,互換性に配慮し,両モードともにいわゆる「四捨五入」処理が実行されます。

Intel CPUの「丸め」処理(最近接偶数丸め)は「四捨五入」ではない,という点に注意してください。特にクライアントは32ビット版,サーバーは64ビット版といった環境でRound() をコールしている場合,処理を実行するマシンによって結果に違いが出ることになります。

miyako

投稿数 : 226
登録日 : 2016/07/05

トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可