• [^] # Re: Une implémentation

    Posté par . En réponse au message Addition de flottants. Évalué à 1.

    Bonjour,

    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