gpt4 book ai didi

perl - 打包和解包 float 时如何消除浮点不准确?

转载 作者:行者123 更新时间:2023-12-03 23:14:47 25 4
gpt4 key购买 nike

我正在打包一组数字,以使用套接字编程通过 UDP 发送到另一块硬件。

当我pack数字 12.2 然后是 unpack它,我得到 12.199999892651。因为我正在处理与纬度和经度相关的数字,所以我不能有这样的偏差。

这是我写的简单脚本:

use warnings;

use Time::HiRes qw (sleep);

@Data = ( 20.2, 30.23, 40.121, 1, 2, 3, 4, 6. 4, 3.2, 9.9, 0.1, 12.2, 0.99, 7.8, 999, 12.3 );

$myArr = pack('f*', @Data);

print "$myArr\n\n";

@Dec = unpack('f*',$myArr);

print "@Dec";

输出是:
20.2000007629395 30.2299995422363 40.1209983825684 1 2 3 4 6.40000009536743 3.20 000004768372 9.89999961853027 0.100000001490116 12.1999998092651 0.9900000095367 43 7.80000019073486 999 12.3000001907349

有什么办法可以控制精度吗?

最佳答案

packf模板用于单精度浮点数,在大多数平台上,它的精度可以达到 7 个左右的小数位。 d模板提供 double ,并且足以容纳约 15 位小数。

print unpack("f", pack("f",12.2));          # "12.1999998092651"
print unpack("d", pack("d",12.2)); # "12.2"

printf "%.20f",unpack("f", pack("f",12.2)); # "12.19999980926513671875"
printf "%.20f",unpack("d", pack("d",12.2)); # "12.19999999999999928946"

关于perl - 打包和解包 float 时如何消除浮点不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39279371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com