?????????? Pourquoi ??????????

0 vue
Accéder directement au premier message non lu

Francois PICHARD

non lue,
8 janv. 1999, 03:00:0008/01/1999
à
Voici un petit programme PERL sense permettre d'etendre la fonction "hex" de PERL.

#!/usr/local/bin/perl -w
use diagnostics;
use strict;

sub hex2dec {
    my($nombreHexa) = shift;
    my($nombreDecimal) = 0;
    my($puissance) = 1;
    my(@tableauHexa) = split('', $nombreHexa);
    while ($#tableauHexa >= 0) {
        $nombreDecimal += $puissance*hex(pop(@tableauHexa));
        $puissance *= 16;
    }
    return $nombreDecimal;
}

my ($val, $lg);
my ($i);
my ($dec);
my ($str);
foreach $i (1..24) {
 $val = 'F' x $i;
 $lg = length ($val);
 if ($lg <= 8) {
  $dec = hex ($val);
  $str = "hex     ";
 }
 else {
  $dec = sprintf ("%.0f", hex2dec ($val));
  $str = "hex2dec ";
 }
 printf STDOUT ("$str : %02d : '$val' -> '$dec'\n", $lg);
}


Le resultat qui est genere est le suivant :

>> test.pl
hex      : 01 : 'F' -> '15'
hex      : 02 : 'FF' -> '255'
hex      : 03 : 'FFF' -> '4095'
hex      : 04 : 'FFFF' -> '65535'
hex      : 05 : 'FFFFF' -> '1048575'
hex      : 06 : 'FFFFFF' -> '16777215'
hex      : 07 : 'FFFFFFF' -> '268435455'
hex      : 08 : 'FFFFFFFF' -> '4294967295'
hex2dec  : 09 : 'FFFFFFFFF' -> '68719476735'
hex2dec  : 10 : 'FFFFFFFFFF' -> '1099511627775'
hex2dec  : 11 : 'FFFFFFFFFFF' -> '17592186044415'
hex2dec  : 12 : 'FFFFFFFFFFFF' -> '281474976710655'
hex2dec  : 13 : 'FFFFFFFFFFFFF' -> '4503599627370495'
hex2dec  : 14 : 'FFFFFFFFFFFFFF' -> '72057594037927936'
hex2dec  : 15 : 'FFFFFFFFFFFFFFF' -> '1152921504606846976'
hex2dec  : 16 : 'FFFFFFFFFFFFFFFF' -> '18446744073709551616'
hex2dec  : 17 : 'FFFFFFFFFFFFFFFFF' -> '295147905179352825856'
hex2dec  : 18 : 'FFFFFFFFFFFFFFFFFF' -> '4722366482869645213696'
hex2dec  : 19 : 'FFFFFFFFFFFFFFFFFFF' -> '75557863725914323419136'
hex2dec  : 20 : 'FFFFFFFFFFFFFFFFFFFF' -> '1208925819614629174706176'
hex2dec  : 21 : 'FFFFFFFFFFFFFFFFFFFFF' -> '19342813113834066795298816'
hex2dec  : 22 : 'FFFFFFFFFFFFFFFFFFFFFF' -> '309485009821345068724781056'
hex2dec  : 23 : 'FFFFFFFFFFFFFFFFFFFFFFF' -> '4951760157141521099596496896'
hex2dec  : 24 : 'FFFFFFFFFFFFFFFFFFFFFFFF' -> '79228162514264337593543950336'
Le resultat est correct jusqu'a la 13eme ligne. Ensuite, la valeur devient paire et est toujours superieure d'une unite celle
que l'on devrait obtenir.


Pourquoi ??
-- 
Cordialement.

Francois PICHARD                            SIRIS
------------------------------------------------------------------
Tel: +33-1-41-97-96-15                      54, Place de l'Ellispe
Fax: +33-1-41-97-96-89                      92983 La Defense Cedex
Mel: fpic...@siris.fr                      FRANCE
------------------------------------------------------------------
 

ts

non lue,
8 janv. 1999, 03:00:0008/01/1999
à
>>>>> "F" == Francois PICHARD <fpic...@siris.fr> writes:

F> Voici un petit programme PERL sense permettre d'etendre la fonction "hex" de PERL.

moulon% cat a.pl
#!/usr/bin/perl
use strict;
use Math::BigInt;

sub HeX {
my $n = shift;
$n = '0' x (4 - (length($n) % 4)) . $n;
my $m = Math::BigInt->new(0);
while (my $o = substr($n, 0, 4, '')){
$m = $m * 65536 + hex $o;
}
$m;
}

print "". HeX('F' x $_)."\n" for 1 .. 24;
moulon% a.pl
+15
+255
+4095
+65535
+1048575
+16777215
+268435455
+4294967295
+68719476735
+1099511627775
+17592186044415
+281474976710655
+4503599627370495
+72057594037927935
+1152921504606846975
+18446744073709551615
+295147905179352825855
+4722366482869645213695
+75557863725914323419135
+1208925819614629174706175
+19342813113834066795298815
+309485009821345068724781055
+4951760157141521099596496895
+79228162514264337593543950335
moulon%

--

Guy Decoux

Répondre à tous
Répondre à l'auteur
Transférer
0 nouveau message