File:
[local] /
rpl /
src /
sommations.c
Revision
1.22:
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Jun 21 15:26:36 2011 UTC (13 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
HEAD
Correction d'une réinitialisation sauvage de la pile des variables par niveau
dans la copie de la structure de description du processus. Cela corrige
la fonction SPAWN qui échouait sur un segmentation fault car la pile des
variables par niveau était vide alors même que l'arbre des variables contenait
bien les variables. Passage à la prerelease 2.
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.0.prerelease.2
4: Copyright (C) 1989-2011 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: Fonction réalisation le tri d'un vecteur de réels du plus petit au plus
29: grand en valeur absolue (algorithme de tri dit de Shell-Metzner)
30: ================================================================================
31: Entrées : pointeur sur une structure struct_processus
32: --------------------------------------------------------------------------------
33: Sorties :
34: --------------------------------------------------------------------------------
35: Effets de bord : néant
36: ================================================================================
37: */
38:
39: void
40: tri_vecteur(real8 *vecteur, unsigned long taille)
41: {
42: logical1 terminaison_boucle_1;
43: logical1 terminaison_boucle_2;
44: logical1 terminaison_boucle_3;
45:
46: real8 registre;
47:
48: signed long indice_i;
49: signed long indice_j;
50: signed long indice_k;
51: signed long indice_l;
52:
53: unsigned long ecartement;
54:
55: ecartement = taille;
56: terminaison_boucle_1 = d_faux;
57:
58: do
59: {
60: ecartement = ecartement / 2;
61:
62: if (ecartement >= 1)
63: {
64: indice_j = 0;
65: indice_k = taille - ecartement;
66: terminaison_boucle_2 = d_faux;
67:
68: do
69: {
70: indice_i = indice_j;
71: terminaison_boucle_3 = d_faux;
72:
73: do
74: {
75: indice_l = indice_i + ecartement;
76:
77: if ((indice_i > 0) && (indice_l > 0))
78: {
79: if (fabs(vecteur[indice_i - 1]) >
80: fabs(vecteur[indice_l - 1]))
81: {
82: registre = vecteur[indice_i - 1];
83: vecteur[indice_i - 1] = vecteur[indice_l - 1];
84: vecteur[indice_l - 1] = registre;
85:
86: indice_i -= ecartement;
87:
88: if (indice_i < 1)
89: {
90: terminaison_boucle_3 = d_vrai;
91: }
92: }
93: else
94: {
95: terminaison_boucle_3 = d_vrai;
96: }
97: }
98: else
99: {
100: terminaison_boucle_3 = d_vrai;
101: }
102: } while(terminaison_boucle_3 == d_faux);
103:
104: indice_j++;
105:
106: if (indice_j > indice_k)
107: {
108: terminaison_boucle_2 = d_vrai;
109: }
110: } while(terminaison_boucle_2 == d_faux);
111: }
112: else
113: {
114: terminaison_boucle_1 = d_vrai;
115: }
116: } while(terminaison_boucle_1 == d_faux);
117: }
118:
119:
120: /*
121: ================================================================================
122: Fonction réalisation la sommation d'un vecteur de réel sans perte
123: de précision
124: ================================================================================
125: Entrées : pointeur sur une structure struct_processus
126: --------------------------------------------------------------------------------
127: Sorties :
128: --------------------------------------------------------------------------------
129: Effets de bord : néant
130: ================================================================================
131: */
132:
133: real8
134: sommation_vecteur_reel(real8 *vecteur, unsigned long *taille,
135: logical1 *erreur_memoire)
136: {
137: #if 0
138: unsigned long nombre_elements;
139: unsigned long pointeur;
140:
141: /*
142: * Sommation des termes en commençant par le plus petit.
143: * Algorithme optimal mais NP-complet...
144: */
145:
146: nombre_elements = (*taille);
147: (*erreur_memoire) = d_faux;
148:
149: while(nombre_elements != 1)
150: {
151: pointeur = (*taille) - nombre_elements;
152: tri_vecteur(&(vecteur[pointeur]), nombre_elements);
153: vecteur[pointeur + 1] += vecteur[pointeur];
154: nombre_elements--;
155: }
156:
157: return(vecteur[(*taille) - 1]);
158: #else
159: real8 erreur;
160: real8 somme;
161: real8 registre;
162: real8 tampon;
163:
164: unsigned long i;
165:
166: somme = 0;
167: erreur = 0;
168:
169: (*erreur_memoire) = d_faux;
170:
171: for(i = 0; i < (*taille); i++)
172: {
173: tampon = somme;
174: registre = vecteur[i] + erreur;
175: somme = tampon + registre;
176: erreur = (tampon - somme) + registre;
177: }
178:
179: return(somme);
180: #endif
181: }
182:
183:
184: /*
185: ================================================================================
186: Fonction réalisation la sommation d'un vecteur de complexes sans perte
187: de précision
188: ================================================================================
189: Entrées : pointeur sur une structure struct_processus
190: --------------------------------------------------------------------------------
191: Sorties :
192: --------------------------------------------------------------------------------
193: Effets de bord : néant
194: ================================================================================
195: */
196:
197: complex16
198: sommation_vecteur_complexe(complex16 *vecteur, unsigned long *taille,
199: logical1 *erreur_memoire)
200: {
201: complex16 cumul;
202:
203: real8 *tampon;
204:
205: unsigned long i;
206: unsigned long nombre_elements;
207:
208: if ((tampon = malloc((*taille) * sizeof(real8))) == NULL)
209: {
210: (*erreur_memoire) = d_vrai;
211:
212: cumul.partie_reelle = 0;
213: cumul.partie_imaginaire = 0;
214:
215: return(cumul);
216: }
217:
218: (*erreur_memoire) = d_faux;
219:
220: /*
221: * Sommation des termes en commençant par le plus petit
222: */
223:
224: for(i = 0, nombre_elements = (*taille); i < nombre_elements;
225: tampon[i] = vecteur[i].partie_reelle, i++);
226:
227: cumul.partie_reelle = sommation_vecteur_reel(tampon, taille,
228: erreur_memoire);
229:
230: /*
231: * Même traitement, mais sur la partie imaginaire
232: */
233:
234: for(i = 0, nombre_elements = (*taille); i < nombre_elements;
235: tampon[i] = vecteur[i].partie_imaginaire, i++);
236:
237: cumul.partie_imaginaire = sommation_vecteur_reel(tampon, taille,
238: erreur_memoire);
239:
240: free(tampon);
241:
242: return(cumul);
243: }
244:
245: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>