Я упаковываю массив чисел для отправки через 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
Есть ли способ контролировать точность?
m/(2**n)
и, следовательно, не может быть точно представлен с использованием типов данных, основанных на типах с плавающей запятой C. Точность теряется в тот момент, когда ваш код сталкивается с числом 12,2 — внутри не существует такого понятия, как значение с плавающей запятой 12,2. У нас есть похожие проблемы с основанием 10, но мы к ним привыкли, поэтому они нас не удивляют. Примером может быть выражение 1/3 в десятичной форме: 0,33? По некоторым параметрам близко, но не точно. - person DavidO   schedule 01.09.2016@Data
искусственный. Обычно он будет состоять из текстовых строк, а не чисел с плавающей запятой. Я думаю, вам нужно отправить текст"@Data"
вместо того, чтобы пытаться упаковать значения как с плавающей запятой. Другой конец, каким бы он ни был, может легко разделить строку на пробелы и восстановить именно то, что было отправлено. - person Borodin   schedule 01.09.2016use strict
, даже в самых простых программах Perl - person Borodin   schedule 01.09.2016