大佬教程收集整理的这篇文章主要介绍了如何将四个字符转换成Perl中的32位IEEE-754 float?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
不行 – 看起来很接近
$float = unpack("f",pack("C4",@arraY[0..3]); # fails for small numbers
作品
@bits0 = split('',unpack("B8",pack("C",shift))); @bits1 = split('',shift))); @bits2 = split('',shift))); @bits3 = split('',shift))); push @bits,@bits3,@bits2,@bits1,@bits0; $mantbit = shift(@bits); $mantsign = $mantbit ? -1 : 1; $exp = ord(pack("B8",join("",@bits[0..7]))); splice(@bits,8); # convert fractional float to decimal for (my $i = 0; $i < 23; $i++) { $f = $bits[$i] * 2 ** (-1 * ($i + 1)); $mant += $f; } $float = $mantsign * (1 + $mant) * (2 ** ($exp - 127));
任何人都有更好的方法吗?
首先,组装你的32位字.取决于字节顺序,这可能必须是相反的方式:
@H_300_4@my $word = ($byte0 << 24) + ($byte1 << 16) + ($byte2 << 8) + $byte3;现在提取单词的部分:符号位,指数和尾数:
@H_300_4@my $sign = ($word & 0x80000000) ? -1 : 1; my $expo = (($word & 0x7F800000) >> 23) - 127; my $mant = ($word & 0x007FFFFF | 0x00800000);组合你的浮动:
@H_300_4@my $num = $sign * (2 ** $expo) * ( $mant / (1 << 23));wikipedia有一些例子.
>在0xC2ED4000 =>上测试-118.625它可以工作.>在0x3E200000 =>上测试0.15625发现了一个bug! (固定)>当$expo == 255时,不要忘记处理无限和NaN
以上是大佬教程为你收集整理的如何将四个字符转换成Perl中的32位IEEE-754 float?全部内容,希望文章能够帮你解决如何将四个字符转换成Perl中的32位IEEE-754 float?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。