trash-area.com ≫ blog ≫ プログラミングphpIEEE-754形式のバイナリをPHPのfloatに変換する

2009年02月03日 0

浮動小数点数がIEEE-754形式(32ビット)の16進文字列を受けて
PHPのfloatにキャストしてreturnするサンプルです。

function bin2float($binstr) {
    $bits = hexdec($binstr);
 
    if ($bits == 0x7f800000)
        return 9.99e99999999;
 
    if ($bits == 0xff800000)
        return -9.99e99999999;
 
    if ((0x7f800001 <= $bits && $bits <= 0x7fffffff) ||
        (0xff800001 <= $bits && $bits <= 0xffffffff))
        return acos(2); // NaN
 
    $s = (($bits >> 31) == 0) ? 1 : -1;
    $e = (($bits >> 23) & 0xff);
    $m = ($e == 0) ?
        ($bits & 0x7fffff) << 1 :
        ($bits & 0x7fffff) | 0x800000;
 
    return floatval($s * $m * pow(2,$e-150));
}

いちおう正の無限大とか負の無限大とか NaN とか実装したつもりです。
いまいちこれであってるのか自信ありません。

IEEE-754 Floating-Point Conversionでぽちぽちと試した感じではおおむねだいじょぶかなぁと。

単純な使い方はこんな感じ。

var_dump(bin2float("40200000"));
var_dump(bin2float("00000000"));
 
var_dump(is_infinite(bin2float("00000000")));
var_dump(is_infinite(bin2float("7F800000")));
 
var_dump(is_nan(bin2float("40200000")));
var_dump(is_nan(bin2float("FF900000")));

バイナリから使うときはこんな感じ。

$b = unpack("H8", pack("c*", 0x40, 0x20, 0x00, 0x00));
var_dump(bin2float($b[1]));

こっから追記

packとかいまいちよくわからないので調べてたら驚愕の事実が。

$data = unpack("f", pack("h*", strrev("40200000")));
var_dump($data);

だからサンプル探してもなかったんですねо
費やした時間がせつなすぎて 。 を о(ろしあ)にしていますо

ここまで追記

ソーシャルブックマーク
はてな Livedoor del.icio.us
関連してそうな記事
同じカテゴリーの別の記事
タグ

トラックバックURL
コメント

コメントをどうぞ

*反映されるまでに時間がかかることがあります。
*メールアドレスはアバターの使用に使います。