2013-09-23 104 views
6

nổi Tôi có đoạn này với một kết quả lạ (279,1 ... so với 279,6 ...):Perl hành vi lạ trên giải nén các giá trị

$ perl -e "print unpack('f>', pack ('f>', 279.117156982422));" 
279.617156982422 

Trong khi người ta làm việc này

$ perl -e "print unpack('f>', pack ('f>', 279.117256982422));" 
279.117248535156 

Và những người đó cũng như

$ perl -e "print unpack('f<', pack ('f<', 279.117156982422));" 
279.11715698242 

$ perl -e "print unpack('f', pack ('f', 279.117156982422));" 
279.117156982422 

Có vấn đề gì? Đó có phải là một lỗi trong việc giải nén các giá trị điểm dấu chấm động không phải là bản địa không?

Lưu ý Perl là phiên bản 5.14.2 dưới Cygwin trên PC.

+1

Hai trường hợp đầu tiên có chạy với các phiên bản khác nhau của perl hoặc các hệ điều hành khác nhau không? –

+0

Kết quả của 'gói' trong trường hợp đầu tiên (ý tôi là, bytecode là gì)? – raina77ow

+0

Sao chép ở đây với 5.14.2 (trên Cygwin trên Win7x64). Hiếu kỳ. Bạn có thể đã tìm thấy một lỗi. Lưu ý rằng 'in giải nén ('H8', gói ('f>', 279.117156982422))' để nhận được các bit trả về '438b8eff', là mẫu bit chính xác theo [trang này] (http: // babbage. cs.qc.cuny.edu/IEEE-754.old/Decimal.html) –

Trả lời

1

Đây là vấn đề GCC.

cpan -t Acme :: Nghiên cứu :: SREZIC chuyển OK trên các hệ thống 32 bit của tôi trong đó nhị phân Perl được biên dịch với GCC 4.5.4 hoặc 4.6.3 hoặc 4.6.4 và không truyền trên các hệ thống trong đó nhị phân Perl được biên dịch với GCC 4.7.3 hoặc 4.8.3

1

Chắc chắn là lỗi trong quá trình giải nén của Perl. Nó có khó khăn trong việc xử lý phao dưới dạng nhị phân xxxxyyFF ít nhất trong nền tảng 32 bit, trong đó 80 <= yy <= BF. Kết quả được đóng gói sẽ trở thành xxxxzzFF, trong đó zz = yy + 40 (tất cả trong hệ thập lục phân). Và đây là không một vấn đề của endianness, như bạn có thể xem tại đây:

$ perl -e "print unpack('H8', pack ('f', unpack('f', pack('H8', '000088ff'))));"; 
0000c8ff 
+1

Tôi đã viết một báo cáo lỗi trên rt.perl. org: https://rt.perl.org/Ticket/Display.html?id=120405 –