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>


Reply via email to