decode_ieee754_float

今日は、floatのエンコード/デコード処理のビッグエンディアン対応とdoubleへの拡張に関して考えていました。
なるべくコードの重複は避けたいので、decode_ieee754_floatを次のフェーズに分けると、

  1. バイト列からエンディアンを考慮して符号なし整数にデコード
  2. 符号なし整数をfloatにデコード

実際にfloatをデコードするコードはエンディアンに依存しなくなります。
プロトタイプも、

// 現: float decode_ieee754_float(const char* src)
float decode_ieee754_float(boost::uint_fast32_t n);

// 現: char* encode_ieee754_float(char* dst, float f)
boost::uint_fast32_t encode_ieee754_float(float f);

と、char*を渡すより簡潔になります。
符号付き整数のデコードも同じように分離できます。


一方、IEEE754 double floatだと、

double decode_ieee754_double(boost::uint_fast64_t n);
boost::uint_fast64_t encode_ieee754_double(double d);

で済みますが、IEEE754 extended floatは80bitなので、大抵の環境では対応する適当なサイズの整数型がありません。
とはいえ、今のところ80bitの浮動小数点型は使いませんし、何よりVC++のlong doubleはdoubleと同じ精度なので無理にサポートする必要はないかも知れません。