my $num = 1.2345;
print join(" ", map { sprintf "0x%02x", $_ }
unpack("C*", pack "f", $num)), "\n";
####
my $num = unpack "f", reverse $packed_num;
####
use POSIX 'ldexp';
sub unpack_f_ieee754 {
my @buf = unpack "C4", $_[0];
my $mant;
my $num;
$mant = $buf[0];
$mant |= $buf[1] << 8;
$mant |= ($buf[2] & 0x7f) << 16;
my $exp = (($buf[3] & 0x7f) << 1) | (($buf[2] >> 7) & 0x01);
my $sign = $buf[3] & 0x80;
if ($exp == 0) {
$num = ldexp($mant, -126 -23);
}
else {
# restore implicit leading
$mant |= 1 << 23;
$num = ldexp($mant, $exp -127 -23);
}
$num = -$num if $sign;
return $num;
}