2016-08-03 9 views
0

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

は、例えばだ、

A = 0x62a5a1c59bd10037 = 1.5944933396238637e + 167

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

正しい出力(単に加算を行うことにより手動で上記の実数の)

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

IがCでA + Bを行うときに、私は私ができる中間操作 http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/

をチェックするためにこのアプリケーションをしようとすると、結果は

= 1.7630682053572525e + 167 = 0x62a7eb3e1c9c3818

に等しいです。 Cが丸めを正しく行っていない(仮に最も近い偶数への丸め)仮数を見てください。この場合、仮数に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 
関連する問題