IEEE-754标准(32位) 十六进制转换十进制浮点数

1.将(32位)16进制IEEE-754标准浮点数就是用十六进制表示浮点,称为单精度浮点数。

举例:IEEE-754标准浮点数表示为 404FC593 H
16进制浮点数与十进制的转化步骤:
1、转换为二进制 0 10000000 10011111100010110010011
2、其第0位 为符号位,为0则表示正数,反之1为复数,其读数值用 s 表示;
3、第1~8位为幂数,其读数值用 e 表示;
4、第9~31位共23位作为系数,视为二进制纯小数,假定该小数的十进制值为 x
则按照规定,该浮点数的值用十进制表示为:= (-1)^s * (1 + x) * 2^(e - 127)

2.幂数的计算

10000000 转换为十进制 128

3.系数的计算

二进制对应的位数的数*2的负位置,再相加
10011111100010110010011

1 1 * 2^(-1)
0 0 * 2^(-2)
0 0 * 2^(-3)
1 1 * 2^(-4)
... ...
1 1 * 2^(-23)
相加可得
0.62321698665618896

4.十进制最后换算

(-1)^0 * (1+ 0.62321698665618896) * 2^(128-127) = 3.246433973312378

<?php 
/**
 * 十六进制浮点型转换十进制
 *
 * @param $strHex
 * @return float
 */
function byte16float($strHex)
{
    $hex_two = base_convert($strHex, 16, 2);  //十六进制转换二进制

    if (strlen($hex_two) == 32) {
        $hex_all = $hex_two;
    } else {
        $hex_all = str_pad($hex_two, 32, 0, STR_PAD_LEFT);  // 补位
    }

    $s = substr($hex_all, 0, 1);  // 0:正数,1:负数

    $e2 = substr($hex_all, 1, 8);  // 幂数
    $e10 = bindec($e2);  // 转换为十进制
    $zE10 = $e10 - 127;   // 指数
    // 小数部分
    $x = substr($hex_all, 9);  // 二进制纯小数
    $x_arr = str_split($x);
    $xs_s = 0;
    foreach ($x_arr as $k => $v) {
        $xs_s += $v * pow(2, -($k + 1));
    }
    // (32位)16进制IEEE-754标准浮点数就是用十六进制表示浮点,称为单精度浮点数
    $res = pow('-1', $s) * (1 + $xs_s) * pow(2, $zE10);
    // 保留3位小数
    $res = round($res, 3);

    return $res;
}
// 例
echo byte16float('404FC593');  // 3.246
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。