L'impression que j'ai c'est que les entiers sont sur 24 bits:
Code : Tout sélectionner
if(fp[0]==0) {
double t = fp[1]*65536 + fp[3]*256 + fp[2];
if(fp[1]&128) t -= 256*65536;
return t;
}
Modérateurs : Papy.G, fneck, Carl
L'impression que j'ai c'est que les entiers sont sur 24 bits:
Code : Tout sélectionner
if(fp[0]==0) {
double t = fp[1]*65536 + fp[3]*256 + fp[2];
if(fp[1]&128) t -= 256*65536;
return t;
}
Code : Tout sélectionner
return 1. * ( int( fp[1] * 256u*256u*256u + fp[3] *256u*256u + fp[2] * 256u ) >> 8 );
Code : Tout sélectionner
//*******************************************************************
// Spectrum/ZX81 Floating point decoder From _SAM_
//*******************************************************************
//IN: 5 Bytes : 1 EXP + 4 Mantissa (sign on the secound byte)
//OUT: DOUBLE
double decode(unsigned char fp[5]) {
double mantisse;
if(fp[0]==0) return (fp[1]&128 ? 1. : -1.)*(fp[2]+fp[3]*256+fp[4]*65536);
mantisse = (((fp[4]/256.0 + fp[3])/256.0 + fp[2])/256.0 + fp[1]))/128.0;
if(mantisse < 1) mantisse += 1; // nombre positif
else mantisse = -mantisse; // nombre negatif
return mantisse*pow(2, fp[0]-129);
}
Code : Tout sélectionner
fp[1]&128 ? 1. : -1
Le code C++, final:Block 1:
Start line: 32768.
10 DIM a(10)
20 LET a(1)=65535
30 LET a(2)=-1
40 LET a(3)=-2
50 LET a(4)=-256
60 SAVE "datas" DATA a()
Header bloc program [Num. ARRAY]
Name...:'datas '
Block 2:
Array(10) :
65535.000000
-1.000000
-2.000000
-256.000000
Code : Tout sélectionner
//*******************************************************************
// Spectrum/ZX81 Floating point decoder From _SAM_ et hlide
//*******************************************************************
//IN: 5 Bytes : 1 EXP + 4 Mantissa (sign on the secound byte)
//OUT: DOUBLE
double decode(unsigned char fp[5]) {
double mantisse;
if(fp[0]==0) {
double t = fp[1]*65536 + fp[3]*256 + fp[2];
if(fp[1]&128) t -= 256*65536;
return t;
}
mantisse = (((fp[4]/256.0 + fp[3])/256.0 + fp[2])/256.0 + fp[1])/128.0;
if(mantisse < 1) mantisse += 1; // nombre positif
else mantisse = -mantisse; // nombre negatif
return mantisse*pow(2, fp[0]-129);
}