0

Verilog でハードウェアの倍精度加算器を実装しています。ハードウェア出力を MATLAB (または C) の倍精度加算出力と比較する検証段階で、同じ丸めモード (最も近い偶数に丸める) を使用していることを考慮して、LSB が一致しない奇妙なケースをいくつか見つけました。 . 私の質問は、C 計算の精度に関するものです。丸めを行う際に本当に正確ですか、それとも一部の CPU アーキテクチャ (32 ビットまたは 64 ビット) に限定されていますか?

これが例です。

= 0x62a5a1c59bd10037 = 1.5944933396238637e+167

B = 0x62724bc40659bf0c = 1.685748657333889e+166 = 0.1685748657333889e+167

正しい出力 (上記の実数を手動で追加するだけ)

= 1.7630682053572526e+167 = 0x62a7eb3e1c9c3819 (これは私のハードウェアと一致します)

CでA + Bを実行しようとすると、結果は次のようになります

= 1.7630682053572525e+167 = 0x62a7eb3e1c9c3818

中間演算を確認するためにこのアプリケーションを試してみると http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/

仮数の追加から、C が丸めを正しく行っていないことがわかります (最も近い偶数に丸めます)。この場合、仮数は 1 を追加して丸められる必要があります。なぜこれが起こっているのですか?

4

1 に答える 1

0

http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/の動作は正しいです。最も近い偶数への最後の丸めは、下方への丸めを実行します。

A+B  + 1.0111111010110011111000011100100111000011100000011000|10 *2^555
                                                            ^
                                                            |
to forget the |10 part (exactly in the middle), the result chooses 0 (even) instead of 1
于 2016-08-04T11:48:04.140 に答える