浮動小数点数の16進ビット列がほしいとき

目次

何の話か

最近浮動小数点数をいじったりオレオレ浮動小数点数フォーマットを作ったりしているのですが、デバッグ時にはやはりビット列を16進数で欲しくなるんですよね。
で、C++でどう書けばいいかという備忘録的な話。

変換

結論から書くとこんな感じ。
最善かは知らない。

昔はreinterpret_castを使ってポインタを介して型の読み替えを行っていましたが、単なる型の読み替えにポインタを使うのは少々憚られるので今はこんな感じのものを使っています。

reinterpret_castを用いた場合とコンパイル結果がになる保証はありません。
例えばgcc 7.3.0/x86_64だと、-O3では16進ビット列がunionの場合と同様に直接命令のオペランドに入るのに対し、デフォルト(-O0)では.rodataに置かれていました。
一方でnvccの場合はデフォルトでもオペランドに直接ビット列の10進数が入ります。
(もっともnvccは浮動小数点定数を代入する場合であってもビット列の10進数がPTXのオペランドに入りますが。)

終わりに

浮動小数点数はどの丸め手法を使うかなど、コンパイル時にも気を使うことが多そうでコンパイラを書く人たちは大変そうですねー。

関連

カテゴリー:C++
記事作成日:2020-08-24