Annotation of rpl/src/depassements.c, revision 1.1

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.0.9
        !             4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
        !             5: 
        !             6:   This file is part of RPL/2.
        !             7: 
        !             8:   RPL/2 is free software; you can redistribute it and/or modify it
        !             9:   under the terms of the CeCILL V2 License as published by the french
        !            10:   CEA, CNRS and INRIA.
        !            11:  
        !            12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
        !            13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
        !            14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
        !            15:   for more details.
        !            16:  
        !            17:   You should have received a copy of the CeCILL License
        !            18:   along with RPL/2. If not, write to info@cecill.info.
        !            19: ================================================================================
        !            20: */
        !            21: 
        !            22: 
        !            23: #include "rpl.conv.h"
        !            24: 
        !            25: 
        !            26: /*
        !            27: ================================================================================
        !            28:   Traitement des dépassements sur les additions entières
        !            29: ================================================================================
        !            30:   Entrée :
        !            31:    - les deux opérandes signées 
        !            32: --------------------------------------------------------------------------------
        !            33:   Sortie :
        !            34:    - drapeau d'erreur
        !            35: --------------------------------------------------------------------------------
        !            36:   Effets de bord : néant
        !            37: ================================================================================
        !            38: */
        !            39: 
        !            40: logical1
        !            41: depassement_addition(integer8 *a, integer8 *b, integer8 *resultat)
        !            42: {
        !            43:    int                         decalage;
        !            44: 
        !            45:    unsigned_integer8           ua;
        !            46:    unsigned_integer8           ub;
        !            47:    unsigned_integer8           unite;
        !            48:    unsigned_integer8           ur;
        !            49: 
        !            50:    decalage = (sizeof(unsigned_integer8) * 8) - 1;
        !            51: 
        !            52:    if ((((*a) <= 0) && ((*b) >= 0)) ||
        !            53:            (((*a) >= 0) && ((*b) <= 0)))
        !            54:    {
        !            55:        (*resultat) = (*a) + (*b);
        !            56:        return(d_absence_erreur);
        !            57:    }
        !            58:    else
        !            59:    {
        !            60:        ua = abs((*a));
        !            61:        ub = abs((*b));
        !            62:        ur = ua + ub;
        !            63:        unite = 1;
        !            64: 
        !            65:        if ((ur >= ua) && (ur <= ((unite << decalage) - 1)))
        !            66:        {
        !            67:            (*resultat) = (*a) + (*b);
        !            68:            return(d_absence_erreur);
        !            69:        }
        !            70:        else
        !            71:        {
        !            72:            (*resultat) = 0;
        !            73:            return(d_erreur);
        !            74:        }
        !            75:    }
        !            76: }
        !            77: 
        !            78: 
        !            79: /*
        !            80: ================================================================================
        !            81:   Traitement des dépassements sur les multiplications entières
        !            82: ================================================================================
        !            83:   Entrée :
        !            84:    - les deux opérandes signées 
        !            85: --------------------------------------------------------------------------------
        !            86:   Sortie :
        !            87:    - drapeau d'erreur
        !            88: --------------------------------------------------------------------------------
        !            89:   Effets de bord : néant
        !            90: ================================================================================
        !            91: */
        !            92: 
        !            93: logical1
        !            94: depassement_multiplication(integer8 *a, integer8 *b, integer8 *resultat)
        !            95: {
        !            96:    int                         decalage;
        !            97: 
        !            98:    unsigned_integer8           limite;
        !            99:    unsigned_integer8           lsba;
        !           100:    unsigned_integer8           lsbb;
        !           101:    unsigned_integer8           lsbr;
        !           102:    unsigned_integer8           msba;
        !           103:    unsigned_integer8           msbb;
        !           104:    unsigned_integer8           msbr;
        !           105:    unsigned_integer8           produit_croise;
        !           106:    unsigned_integer8           ua;
        !           107:    unsigned_integer8           ub;
        !           108:    unsigned_integer8           unite;
        !           109: 
        !           110:    decalage = sizeof(unsigned_integer4) * 8;
        !           111:    unite = 1;
        !           112: 
        !           113:    ua = abs((*a));
        !           114:    ub = abs((*b));
        !           115: 
        !           116:    lsba = (ua << decalage) >> decalage;
        !           117:    lsbb = (ub << decalage) >> decalage;
        !           118:    msba = ua >> decalage;
        !           119:    msbb = ub >> decalage;
        !           120: 
        !           121:    if ((msba != 0) && (msbb != 0))
        !           122:    {
        !           123:        (*resultat) = 0;
        !           124:        return(d_erreur);
        !           125:    }
        !           126:    else
        !           127:    {
        !           128:        produit_croise = (limite = (msba * lsbb)) + (msbb * lsba);
        !           129: 
        !           130:        /*
        !           131:        * Traitement du débordement sur produit_croisé
        !           132:        */
        !           133: 
        !           134:        if (produit_croise < limite)
        !           135:        {
        !           136:            msbr = (msba * msbb) + (produit_croise >> decalage) +
        !           137:                    (unite << (decalage + 1));
        !           138:        }
        !           139:        else
        !           140:        {
        !           141:            msbr = (msba * msbb) + (produit_croise >> decalage);
        !           142:        }
        !           143: 
        !           144:        if (msbr != 0)
        !           145:        {
        !           146:            (*resultat) = 0;
        !           147:            return(d_erreur);
        !           148:        }
        !           149:        else
        !           150:        {
        !           151:            lsbr = (limite = (lsba * lsbb)) + (produit_croise << decalage);
        !           152: 
        !           153:            if ((lsbr >= limite) && (lsbr <= ((unite << ((2 * decalage) - 1))
        !           154:                    - 1)))
        !           155:            {
        !           156:                (*resultat) = (*a) * (*b);
        !           157:                return(d_absence_erreur);
        !           158:            }
        !           159:            else
        !           160:            {
        !           161:                (*resultat) = 0;
        !           162:                return(d_erreur);
        !           163:            }
        !           164:        }
        !           165:    }
        !           166: }
        !           167: 
        !           168: 
        !           169: /*
        !           170: ================================================================================
        !           171:   Traitement des dépassements sur les puissances entières a ** b
        !           172: ================================================================================
        !           173:   Entrée :
        !           174:    - a signé, b non signé.
        !           175: --------------------------------------------------------------------------------
        !           176:   Sortie :
        !           177:    - drapeau d'erreur
        !           178: --------------------------------------------------------------------------------
        !           179:   Effets de bord : néant
        !           180: ================================================================================
        !           181: */
        !           182: 
        !           183: logical1
        !           184: depassement_puissance(integer8 *a, integer8 *b, integer8 *resultat)
        !           185: {
        !           186:    int                         decalage;
        !           187: 
        !           188:    integer8                    i;
        !           189: 
        !           190:    logical1                    depassement;
        !           191: 
        !           192:    unsigned_integer8           r;
        !           193:    unsigned_integer8           unite;
        !           194: 
        !           195:    if ((*b) < 0)
        !           196:    {
        !           197:        (*resultat) = 0;
        !           198:        return(d_erreur);
        !           199:    }
        !           200: 
        !           201:    if ((*a) <= 1)
        !           202:    {
        !           203:        if ((*a) == 0)
        !           204:        {
        !           205:            (*resultat) = 0;
        !           206:        }
        !           207:        else
        !           208:        {
        !           209:            (*resultat) = 1;
        !           210:        }
        !           211: 
        !           212:        return(d_absence_erreur);
        !           213:    }
        !           214: 
        !           215:    depassement = d_faux;
        !           216:    r = abs(*a);
        !           217: 
        !           218:    for(i = 0; i < (*b); i++)
        !           219:    {
        !           220:        if (depassement_multiplication(&r, a, &r) == d_erreur)
        !           221:        {
        !           222:            depassement = d_vrai;
        !           223:            break;
        !           224:        }
        !           225:    }
        !           226: 
        !           227:    if (depassement == d_vrai)
        !           228:    {
        !           229:        (*resultat) = 0;
        !           230:        return(d_erreur);
        !           231:    }
        !           232:    else
        !           233:    {
        !           234:        decalage = (sizeof(unsigned_integer8) * 8) - 1;
        !           235:        unite = 1;
        !           236: 
        !           237:        if (r <= ((unite << decalage) - 1))
        !           238:        {
        !           239:            f77puissanceii_(a, b, resultat);
        !           240:            return(d_absence_erreur);
        !           241:        }
        !           242:        else
        !           243:        {
        !           244:            (*resultat) = 0;
        !           245:            return(d_erreur);
        !           246:        }
        !           247:    }
        !           248: }
        !           249: 
        !           250: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>