0

で満たされた NEON レジスタがありfloat32ます。メインCPUに戻すことなく、最も近い整数に丸めたいと思います。に変換する NEON 命令はfloat32単純uint32に切り捨てられるため、たとえば、 ではなく に39.7なります。どのように処理されるかについてはあまり気にしません。ゼロから丸めたり、丸めたりして、両方が機能します。39400.5

丸めを実装するために私が見ることができる最良の方法は、

  • に変換しint32ます (したがって、切り捨てます)
  • に戻す_float32
  • に 1 を足してint32に戻しfloat32、切り上げる場合に備えて取っておきます
  • 減算
  • と比較し0.5ます(私の場合、それらはすべて正になることがわかっているため、絶対値は必要ありません)
  • 比較結果に基づいて truncated または truncated + 1 を選択します

それは醜く、遅く、複雑に思えます。

よりクリーンで、より速く、よりシンプルで、より健全な方法はありますか?

4

2 に答える 2

7

.5 を追加して整数に変換します。結果を浮動小数点形式にしたい場合は、逆に変換してください。

数値がすべて正であることはわかっているので、別のオプションは 0x1p23 を加算して 0x1p23 を減算することです。0x1p23 を追加した結果は少なくとも 0x1p23 であるため、浮動小数点数の結果には 1 未満の値を持つビットがないため、整数に丸められている必要があります。次に、0x1p23 を減算すると、加算された値が減算され、丸めの効果のみが残ります。

更新: 入力が [0x1p47, 0x1p48) にあり、その下位ビットが 1 の場合、この 2 番目の方法は失敗します。次に、0x1p23 は入力の ULP の半分であるため、加算によって上向き (偶数) に丸められ、減算は効果がありません。それを修正するための修正があると思いますが、手元にありません。

于 2012-05-26T01:12:20.227 に答える