簡體   English   中英

是否可以使用perl的vec()函數存儲浮點數?

[英]Is it possible to store floating point numbers using perl's vec() function?

我有一個處理數百萬行性能數據的perl腳本,所以我需要一種方法來有效地存儲度量信息。 我發現了perl的vec()函數,它允許你直接操作字符串的位。 這可以用於以存儲器有效的方式模擬陣列。

它非常適合存儲整數值。 但對於浮點值,它不能很好地工作。

這是一個例子:

#!/usr/bin/perl

my ($s) = '';

vec($s, 0, 32) = 1234;
vec($s, 1, 32) = 12.34;
vec($s, 2, 32) = pack('f', 12.34);

print "1st vec: " . vec($s, 0, 32) . " (should be '1234')\n";
print "2nd vec: " . vec($s, 1, 32) . " (should be '12.34')\n";
print "3rd vec: " . unpack ('f', vec($s, 2, 32)) . " (should be '12.34')\n";

在我的機器上運行此代碼(Mac OS X 10.6.7,perl 5.8.9)將返回以下內容:

1st vec: 1234 (should be '1234')
2nd vec: 12 (should be '12.34')
3rd vec:  (should be '12.34')

如您所見,在簡單的情況下,perl只是將浮點數向下舍入到最接近的整數。 我甚至試圖通過使用pack() / unpack()來獲得幻想,但這只是將所有位都歸零。

我嘗試了幾種變體,增加了比特數,谷歌搜索等等都無濟於事。 這看起來確實應該有效,因為在一天結束時,它只是一點點。

謝謝。

vec只寫整數,這就是為什么第二個例子中的12.34被轉換為12.第三個例子中的打包字符串被轉換為0,unpack('f',0)失敗。

一種解決方案是將打包值寫為整數,

  vec($s, 2, 32) = unpack('L', pack('f', 12.34));
  print unpack('f', pack('L', vec($s, 2, 32))), "\n";


但是,最好不要通過vec使用繞行,而是使用substr的4參數版本,即指定(expr,offset,length,replacement):

 substr($s, 2*4, 4, pack("f", 12.34));
 print unpack("f", substr($s, 2*4)), "\n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM