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