decode_ieee754_float
今日は、floatのエンコード/デコード処理のビッグエンディアン対応とdoubleへの拡張に関して考えていました。
なるべくコードの重複は避けたいので、decode_ieee754_floatを次のフェーズに分けると、
- バイト列からエンディアンを考慮して符号なし整数にデコード
- 符号なし整数を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と同じ精度なので無理にサポートする必要はないかも知れません。