Data-MATFile
view release on metacpan or search on metacpan
lib/Data/MATFile.pm view on Meta::CPAN
64" format) into a Perl floating point number.
=cut
# http://www.perlmonks.org/bare/?node_id=703222
sub double_from_hex { unpack 'd', scalar reverse pack 'H*', $_[0] }
use constant POS_INF => double_from_hex '7FF0000000000000';
use constant NEG_INF => double_from_hex 'FFF0000000000000';
use constant NaN => double_from_hex '7FF8000000000000';
sub parse_double
{
my ($bytes) = @_;
my ($bottom, $top) = unpack ("LL", $bytes);
# Reference:
# http://en.wikipedia.org/wiki/Double_precision_floating-point_format
# Eight zero bytes represents 0.0.
if ($bottom == 0) {
lib/Data/MATFile.pm view on Meta::CPAN
return -0;
}
elsif ($top == 0x7ff00000) {
return POS_INF;
}
elsif ($top == 0xfff00000) {
return NEG_INF;
}
}
elsif ($top == 0x7ff00000) {
return NaN;
}
my $sign = $top >> 31;
# print "$sign\n";
my $exponent = (($top >> 20) & 0x7FF) - 1023;
# print "$exponent\n";
my $e = ($top >> 20) & 0x7FF;
my $t = $top & 0xFFFFF;
# printf ("--> !%011b%020b \n--> %032b\n", $e, $t, $top);
my $mantissa = ($bottom + ($t*(2**32))) / 2**52 + 1;
# print "$mantissa\n";
( run in 0.237 second using v1.01-cache-2.11-cpan-4d50c553e7e )