From: Mark Cohen <mailto:[EMAIL PROTECTED]> wrote:
: Hello ,
:
: I have a transferred a file from an IBM mainframe
: to a windows platform that I need to analyse. The
: file contains an 8 byte floating point hexadecimal
: representaion 44FE880000000000.
:
: This should be converted to the number 65160.
When I use this sub I get 1.21711040165713e-008
not 65160.
print floatmvs( '44FE880000000000' );
: sub floatmvs {
: my $mat=0;
: my $firstbyte = unpack "H2", $_[0];
: my $exp=$firstbyte-40; # base 16
: my $bin=unpack('B*',substr($_[0],1,7));
: for ($start=0; $start <56; $start+=1) {
: $bit=substr($bin,$start,1);
: $bitpos=$start+1;
: if ($bit == 1) {
: $val=(1/2)**($bitpos);
: $mat=$mat+$val;
: }
: }
: my $num=$mat*(16**$exp);
: return $num;
: }
With 'strict' and 'warnings' turned on, I get
the same result with this.
use strict;
use warnings;
print floatmvs2( '44FE880000000000' );
sub floatmvs2 {
my @bits = split //, unpack 'B*', substr( $_[0], 1, 7 );
my $mat = 0;
foreach my $pos ( 0 .. $#bits ) {
$mat += $bits[ $pos ] * ( 1 / 2 ) ** ( $pos + 1 );
}
my $exp = unpack( 'H2', $_[0] ) - 40;
return $mat * ( 16 ** $exp );
}
HTH,
Charles K. Clarkson
--
Mobile Homes Specialist
254 968-8328
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>