sub IEEE64toIEEE80 { my( $mantissa, $exponent, $sign ) = unpack 'a52 a11 a1', unpack 'b64', pack 'd', $_[ 0 ]; return unpack 'd', pack 'b80', '0' x 79 . $sign unless $mantissa =~ m[1] or $exponent =~ m[1]; if( $exponent !~ m[0] ) { $exponent = '111111111111111'; } else { $exponent = unpack( 'v', pack 'b11', $exponent ) - 1023; $exponent -= length( $1 ) if $exponent == -1023 and $mantissa =~ m[(0+$)]; $exponent = unpack 'b15', pack 'v', $exponent + 16383; } return pack 'b80', '0'x 11 . $mantissa . '1' . $exponent . $sign; }