[英]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.