--- rpl/src/calcul_integral.c 2012/01/05 10:18:58 1.31 +++ rpl/src/calcul_integral.c 2015/01/05 15:32:12 1.53 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.5 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.20 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -55,14 +55,14 @@ integrale_romberg(struct_processus *s_et struct_variable s_variable; - unsigned long i; - unsigned long j; - unsigned long k; - unsigned long n; - unsigned long p; - unsigned long nombre_elements; - unsigned long nombre_termes; - unsigned long taille_vecteur_precedent; + integer8 i; + integer8 j; + integer8 k; + integer8 n; + integer8 p; + integer8 nombre_elements; + integer8 nombre_termes; + integer8 taille_vecteur_precedent; /* * Création d'une variable locale représentant la variable d'intégration @@ -137,7 +137,15 @@ integrale_romberg(struct_processus *s_et do { - h = (b - a) / (nombre_elements = (1ULL << (++n))); + h = (b - a) / ((real8) (nombre_elements = (((integer8) 1) << (++n)))); + + if (nombre_elements == 0) + { + // Dépassement de capacité + n--; + break; + } + x = a; /* @@ -146,7 +154,8 @@ integrale_romberg(struct_processus *s_et t_tampon = t; - if ((t = (real8 **) malloc((n + 1) * sizeof(real8 *))) == NULL) + if ((t = (real8 **) malloc((((size_t) n) + 1) * sizeof(real8 *))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -154,7 +163,8 @@ integrale_romberg(struct_processus *s_et for(i = 0; i <= n; i++) { - if ((t[i] = (real8 *) malloc((n + 1) * sizeof(real8))) == NULL) + if ((t[i] = (real8 *) malloc((((size_t) n) + 1) * sizeof(real8))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -180,7 +190,7 @@ integrale_romberg(struct_processus *s_et * Boucle principale */ - if ((vecteur = (real8 *) malloc((nombre_elements + 1) * + if ((vecteur = (real8 *) malloc((((size_t) nombre_elements) + 1) * sizeof(real8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -258,8 +268,8 @@ integrale_romberg(struct_processus *s_et for(p = 1; p <= n; p++) { k = n - p; - t[p][k] = ((pow(4, p) * t[p - 1][k + 1]) - t[p - 1][k]) / - ((real8) (pow(4, p) - 1)); + t[p][k] = ((pow(4, (real8) p) * t[p - 1][k + 1]) - t[p - 1][k]) / + ((real8) (pow(4, (real8) p) - 1)); } } while(((erreur = fabs(t[n][0] - t[n - 1][0])) > precision) && ((*s_etat_processus).var_volatile_requete_arret == 0)); @@ -340,7 +350,7 @@ evaluation_romberg(struct_processus *s_e struct_objet *s_expression, unsigned char *variable, real8 *point, real8 *valeur, logical1 *validite) { - long hauteur_pile; + integer8 hauteur_pile; struct_liste_pile_systeme *l_position_normale; @@ -415,7 +425,7 @@ evaluation_romberg(struct_processus *s_e */ while((*s_etat_processus).hauteur_pile_operationnelle > - (unsigned long) hauteur_pile) + hauteur_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) @@ -466,7 +476,7 @@ evaluation_romberg(struct_processus *s_e if ((*s_objet).type == INT) { - (*valeur) = (*((integer8 *) (*s_objet).objet)); + (*valeur) = (real8) (*((integer8 *) (*s_objet).objet)); (*validite) = d_vrai; } else if ((*s_objet).type == REL)