J'aimerais mettre l'opérateur ternaire sous une forme "normale", mais je ne vois pas comment :
res = (sr?(1<<31):0) | er | (((unsigned int)mr&0x7FFF)<<8);
j'ai réussi à faire :
res = (sr?(1<<31):0);
res=res|er;
res=res|(((unsigned long int)mr&0x7FFFF)<<8);
Autre question, je dois avoir une mantisse en unsigned long int
Je la récupère correctement, mais j'obtiens des résultats incorrects, voila mon code :
void separeFloat (float x, char *sig, char *exp, unsigned long int *mant);
float fadd(float a, float b) {
char signe1, signe2, signeRes;
unsigned long int mantisse1, mantisse2, mantisseRes;
unsigned long int buf;
char exposant1, exposant2, exposantRes;
unsigned int res;
separeFloat(a, &signe1, &exposant1, &mantisse1);
separeFloat(b, &signe2, &exposant2, &mantisse2);
//computation
//Alignment
if (exposant1>exposant2) {
exposantRes = exposant1;
while (exposant1>exposant2) {
mantisse2>>=1;
exposant2++;
}
} else {
exposantRes = exposant2;
while (exposant2>exposant1) {
mantisse1>>=1;
exposant1++;
}
}
buf = (unsigned long int)mantisse1 + (unsigned long int)mantisse2;
//Rescale
while (buf>0xFFFFFFFF) {
buf>>=1;
exposantRes++;
}
mantisseRes = buf;
// The sign is ignored (for the moment)
signeRes = signe1;
exposantRes<<=23;
//RePack
res = (signeRes?(1<<31):0);
res=res|exposantRes;
res=res|(((unsigned long int)mantisseRes&0x7FFFFFFF)<<8);
[^] # Re: Une implémentation
Posté par Animatrix . En réponse au message Addition de flottants. Évalué à 1.
J'aimerais mettre l'opérateur ternaire sous une forme "normale", mais je ne vois pas comment :
res = (sr?(1<<31):0) | er | (((unsigned int)mr&0x7FFF)<<8);j'ai réussi à faire :
res = (sr?(1<<31):0);res=res|er;
res=res|(((unsigned long int)mr&0x7FFFF)<<8);
Autre question, je dois avoir une mantisse en unsigned long int
Je la récupère correctement, mais j'obtiens des résultats incorrects, voila mon code :
void separeFloat (float x, char *sig, char *exp, unsigned long int *mant);
float fadd(float a, float b) {
char signe1, signe2, signeRes;
unsigned long int mantisse1, mantisse2, mantisseRes;
unsigned long int buf;
char exposant1, exposant2, exposantRes;
unsigned int res;
separeFloat(a, &signe1, &exposant1, &mantisse1);
separeFloat(b, &signe2, &exposant2, &mantisse2);
//computation
//Alignment
if (exposant1>exposant2) {
exposantRes = exposant1;
while (exposant1>exposant2) {
mantisse2>>=1;
exposant2++;
}
} else {
exposantRes = exposant2;
while (exposant2>exposant1) {
mantisse1>>=1;
exposant1++;
}
}
buf = (unsigned long int)mantisse1 + (unsigned long int)mantisse2;
//Rescale
while (buf>0xFFFFFFFF) {
buf>>=1;
exposantRes++;
}
mantisseRes = buf;
// The sign is ignored (for the moment)
signeRes = signe1;
exposantRes<<=23;
//RePack
res = (signeRes?(1<<31):0);
res=res|exposantRes;
res=res|(((unsigned long int)mantisseRes&0x7FFFFFFF)<<8);
return *((float*)&res);
}
Je ne vois pas où je me trompe, car je trouve :
2.3 + -3.2 =わ 36893488147419103232.000000 -> gloups