मेरे पास एक प्रोजेक्ट है जहां एक फ़ंक्शन को चार 8-बिट वर्ण प्राप्त होते हैं और परिणामी 32-बिट आईईईई -754 फ्लोट को नियमित पर्ल नंबर में कनवर्ट करने की आवश्यकता होती है। ऐसा लगता है कि नीचे दिए गए कामकाजी कोड की तुलना में तेज़ तरीका होना चाहिए, लेकिन मैं काम करता है कि एक सरल पैक समारोह को समझने में सक्षम नहीं है।मैं चार पात्रों को पर्ल में 32-बिट आईईईई -754 फ्लोट में कैसे परिवर्तित कर सकता हूं?
यह काम नहीं करता है, लेकिन ऐसा लगता है जैसे कि यह करीब है:
$float = unpack("f", pack("C4", @array[0..3]); # Fails for small numbers
काम करता है:
@bits0 = split('', unpack("B8", pack("C", shift)));
@bits1 = split('', unpack("B8", pack("C", shift)));
@bits2 = split('', unpack("B8", pack("C", shift)));
@bits3 = split('', unpack("B8", pack("C", shift)));
push @bits, @bits3, @bits2, @bits1, @bits0;
$mantbit = shift(@bits);
$mantsign = $mantbit ? -1 : 1;
$exp = ord(pack("B8", join("",@bits[0..7])));
splice(@bits, 0, 8);
# Convert fractional float to decimal
for (my $i = 0; $i < 23; $i++) {
$f = $bits[$i] * 2 ** (-1 * ($i + 1));
$mant += $f;
}
$float = $mantsign * (1 + $mant) * (2 ** ($exp - 127));
किसी को भी एक बेहतर तरीका है?
मुझे खेद है कि आपका शीर्ष स्निपेट "काम नहीं करता है लेकिन करीब है" - क्या आप मतभेदों को इंगित कर सकते हैं? जैसे अनपैक() का परिणाम लेकर और इसे 4 बाइट्स में परिवर्तित कर, फिर इनपुट और अंतिम आउटपुट के बीच अलग-अलग बिट्स की तलाश कर रहे हैं? –