IEEE754 to float;

mtek

Новичок
IEEE754 to float

Имею на выходе число представленное в стандарте ieee754.

Далее число необходимо конвертировать в float.

На сайте http://math.semestr.ru/inf/ieee754.php - имеется онлайн калькулятор для этого дела.
Сайт выдает верное решение, а найденные скрипты и команды на различных форумах не выдают мне желательного результата.

$dec="16100"
$hex="3EE4"
$bin="0011111011100100"

$result = ?
// $result = 0,125

Надеюсь на помощь!)
 

WMix

герр M:)ller
Партнер клуба
IEEE754 это и есть float так они в php и хранятся. вероятно чтото ты не понимаешь
 

mtek

Новичок
IEEE754 это и есть float так они в php и хранятся. вероятно чтото ты не понимаешь
Да, это стандарт представления чисел с плавающей точкой, используется в разный языках.

Вероятно не верно использую функцию.
 

mtek

Новичок
Использую так:

$uint16 = "16100";
$bindata = int_helper::uInt16($uint16) . PHP_EOL ;
echo unpack("f",$bindata)[1];

//1.0979173566739E-5

Верный результат 0,125..
В чем ошибка?
 

antson

Новичок
Партнер клуба
во всем ;)
тебе нужен тип float а работаешь с без знаковым целым 16 бит
в описании pack() про флоат и добл ясно написано, что они машинозависимые .
pack('f',0.125) явно не пытался.

задание у тебя научиться работать с последовательностью байт и битовыми операциями.

$iee = 0x3E000000; // 0.125

и тут ты должен теперь
узнать знак числа старший бит первого байта
двоичную степень мантисы 7 бит из первого байта и старший бит 2го байта
помнишь + 127 , чтобы избежать знака? правильно вычитаем -127
во втором байте старший бит ставим в единицу - так считается, что в нормализованной мантисе он всегда 1 и его как видишь используют под экспоненту
забираем 2-4 байт в переменную
возводим в степень
восстанавливаем знак числа
 

PA3JlUBHOE

Новичок
$hex="3EE4" не по стандарту IEEE-754. В стандарте минимум 4 байта.
Вот работающий код преобразования поступивших от некоего устройства четырёх байтов данных, которые образуют число с плавающей точкой в формате IEEE-754 в float:
$result[0] = "\x3E"; //байт 4
$result[1] = "\x00"; //байт 3
$result[2] = "\x00"; //байт 2
$result[3] = "\x00"; //байт 1
//размещаем байты в порядке 1-2-3-4:
$word = $result[3].$result[2].$result[1].$result[0];
//Преобразуем 4 байта во float
$float_data = (unpack("f", $word)[1]);
//Смотрим результат
echo $float_data;

Получаем на экране:
0.125

Важные условия для правильного результата работы unpack:
1. Порядок байт 1-2-3-4
2. $word это строка!
 
Сверху