Seite 1 von 1
exe schaft unterschiedliche Erg. auf verschieden rechnern???
Verfasst: 14. Oktober 2006 18:44
von 24dan
Hallo ich habe ein Divisionsprogramm für grossstellige ganzzahlen geschrieben.
Jetzt erhalte ich auf meinem Notebook ein anderes Ergebnis als auf dem eines Freundes. (beides XP, Pentium, auf beiden QT4 kompiliert)
Wie kann das zustande kömmen?
Ich verwende modulo und habe die divison als schriftliche nachgebaut:
Hier mein Quelltext:
Code: Alles auswählen
/*################################################
function: division_big ( )
assignment: division
parameter: int i_ptr = pointer of the value that has to be divide
int i_len = count of the value that has to be divide
return: pointer of the results or err_nr
#################################################*/
void division_big(RESULTS *res, int *i_ptr, int i_len, std::ostream& outfile)
{
int divisors [11] = {3,4,5,7,11,12,13,17,19,37,73}, *i_ptr_divisors;
i_ptr_divisors = divisors;
int *start_arr;
start_arr = i_ptr;
int* i = new int(0);
int* j = new int(1);
do{
i_ptr = start_arr; // pointer vom Anfang der Zahl die diviert wird
int k, i_log, i_erg, i_x ,i_rest=0;
for ( k=0; k<i_len; k++, i_ptr++)
{
i_log = log10( *i_ptr )+1; // log10 gibt mir die Stellen der aktuellen Zahl aus; x<1 -> x=1
i_x = pow ( 10, i_log-1 );
if ( *i_ptr == 0)
i_log = 1;
i_erg = ( *i_ptr + pow ( 10, i_log ) * i_rest ); // zum Teilerg. wird der rest von der letzten divison hinzuaddiert
i_rest = i_erg%*i_ptr_divisors; // rest ermitteln
}
if (i_erg%*i_ptr_divisors == 0) {
switch (*i_ptr_divisors){
case (3): res->results += "3,"; break;
case (4): res->results += "4,"; break;
case (5): res->results += "5,"; break;
case (7): res->results += "7,"; break;
case (11): res->results += "11,"; break;
case (12): res->results += "12,"; break;
case (13): res->results += "13,"; break;
case (17): res->results += "17,"; break;
case (19): res->results += "19,"; break;
case (37): res->results += "37,"; break;
case (73): res->results += "73"; break;
}
*j = 2; // set switch if somehow value is selected
}
*i +=1;
i_ptr_divisors++;
} while( *i < 11);
if ( *j==1) res->results += "0"; // set zero if nothing is selected or the value is zero
*j = res->results.rfind(","); // to erase the last comma
*i = res->results.length();
if (*j != -1) if ( (*i-*j) ==1 ) res->results.erase( *j, *i);
delete i;
delete j;
outfile<<setfill(' ')<<setw(20)<<left<<res->results;
}
Verfasst: 14. Oktober 2006 19:00
von upsala
Sorry, aber ich seh' da keinen Bezug zu QT. Du verwendest weder Qt-Funktionen noch Qt-Container. Mal davon abgesehen, gibt es fertige Bibliotheken für große Zahlen (CLN und GMP z.B.)
Verfasst: 14. Oktober 2006 20:25
von Christian81
upsala hat geschrieben:Sorry, aber ich seh' da keinen Bezug zu QT.
stimmt,
zumal er nicht gesagt hat was nun rauskommt (und was rauskommen soll) und ob es ggf. ein Pentium mit FDIv -Bug ist...
Verfasst: 15. Oktober 2006 10:28
von 24dan
upsala hat geschrieben:Sorry, aber ich seh' da keinen Bezug zu QT. Du verwendest weder Qt-Funktionen noch Qt-Container. Mal davon abgesehen, gibt es fertige Bibliotheken für große Zahlen (CLN und GMP z.B.)
Hallo und vielen Dank für die Antwort...
ich habe mich an das QT Forum gewandt da ich die Gui in die ich meine c/c++ files mit einbinde in QT4 geschrieben habe und dort dann auch kompiliere.
Mir ist nicht klar wie ich im Assistant für QT4 den Kopf von Class Library for Numbers (CLN) finde? Beim "Suchen" wirft er mir nur Bruchstücke von Funktionen raus die mir zu dem Thema nicht passend scheinen.
Über GMP (GNU MP arbitrary precision arithmetic library) habe ich im Assistant auch nichts gefunden.
Fazit:
Ich bin sehr froh über jede Hilfe die mir das Problem erklärt und zur Lösung beiträgt.
Eine konkrete Frage: Wie kann ich den die Funktion umschreiben? Welche Funktionen verwende ich konkret.
Hier nochmals die Zahl die ich teile und die Ergebnisse in der einfachen Folge und im Kehrwert der Zahl auf Rechner A und B
Zahl:
Code: Alles auswählen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
Ergebnisse auf Rechner A
Ergebnisse auf Rechner B
Die verwendeten Divisoren sind:
3,4,5,7,11,12,13,17,19,37,73
Bin für jede Hilfe offen...
Verfasst: 15. Oktober 2006 10:46
von upsala
CLN und
GMP sind externe Bibliotheken und haben eigentlich auch nichts mit Qt zu tun.[/url]
Verfasst: 15. Oktober 2006 11:37
von BartSimpson
Mit CLN dürfte es schwierig werden, da es nicht ohne weiteres unter seinem beschriebenen Windows läuft.
Die GMP Seite scheint irgenwie tot zu sein.
Verfasst: 15. Oktober 2006 14:21
von 24dan
BartSimpson hat geschrieben:Mit CLN dürfte es schwierig werden, da es nicht ohne weiteres unter seinem beschriebenen Windows läuft.
Die GMP Seite scheint irgenwie tot zu sein.
Danke. Okay Fazit:
1. Ich kann die Bibliotheken nicht mal eben so nutzen.
2. Ihr habt auch keine Ahnung warum da unterschiedliche Ergebnisse zustande kommen?
3. Wo könnte ich denn Fehler gemacht haben?
( Ich habe jetzt schon alle verwendeten Pointer in der Divison ersetzt durch einfache int variablen)
Vielen Dank für Eure Hilfe.
Verfasst: 15. Oktober 2006 14:53
von Christian81
Bau doch einfach mal ein paar Debug-Ausgaben ein...
Verfasst: 15. Oktober 2006 18:32
von 24dan
Christian81 hat geschrieben:Bau doch einfach mal ein paar Debug-Ausgaben ein...
Okay und es hat geholfen den Fehler konkret fest zu machen:
Hier mal das Zwischenergebnisse nachdem ich den Quelltext wie folgt abgewandelt habe:
Code: Alles auswählen
...stuff
do{
i_divisors = divisors[t];
i_ptr = start_arr;
int k, i_log, i_erg, i_rest=0;
outfile<<endl<<"divisor "<<i_divisors<<endl;
for ( k=0; k<i_len; k++, i_ptr++)
{
i_log = log10(*i_ptr)+1;
if ( *i_ptr == 0) i_log = 1;
i_erg = (*i_ptr + (pow ( 10, i_log ) * i_rest ));
outfile<<"("<<i_erg<<")";
i_rest = i_erg%i_divisors;
outfile<<i_rest<<" ";
}
...stuff
Folgende Zahl habe ich durch 3 geteilt:
Code: Alles auswählen
4 90 5 9 8 9 30 6 5 50 7 9 2 200 5 100 300 40 4 9 5 500 1 8 90 8 5 9 200 800 300 5 90 20 5 50 50 5 50 300 50 4 400 9 5 90 2 5 4 9 50 7 300 50 7 5 50 100 9 50 4 800 300 2 5 1 3 8 200 5 50 300 40 100 9 5 800 300 5 90 6 1 8 90 5 50 4 5 50 50 5 100 100 200 5 8 200 7 5 100 3 8 90 9 5 2 5 50 9 8 90 500 5 90 4 5 200 40 9 3 8 100 300 3 8 5 50 300 50 4 6 9 50 4 5 50 4 5 50 50 500 5 50 50 9 8 90 40 9 3 8 400 60 50 7 1 50 800 5 40 8 5 90 800 5 50 100 300 3 8 5 50 500 5 90 4 5 200 100 60 500 9 30 30 9 3 8 40 9 3 8 400 60 50 5 300 3 8 6 9 50 4 5 50 30 1 100 100 5 50 300 50 4 500 5 90 4 5 40 300 5 200 9 7 9 100 200 100 9 5 8 5 4 5 40 7 5 2 5 9 3 8 40 5 9 50 5 7 50 1 4 5 100 70 90 9 3 8 200 4 5 90 8 5 90 90 300 50 4 4 5 90 90 300 6 4 5 100 7 5 9 100 200 5 100 1 50 10 5 50 5 4 9 5 9 40 200 60 4 5 100 9 50 4 9 100 200 4 9 5 100 5 90 50 1 8 200 5 300 3 8 800 300 7 60 200 200 100 60 50 1 8 200 5 90 100 9 3 8 800 300 5 300 3 8 300 50 4 4 5 90 1 40 200 1 7 5 500 1 50 4 5 30 200 4 5 90 100 200 60 5 100 100 200 100 9 3 8 50 9 3 8 200 4 5 50 50 5 100 9 100 200 4 1 100 30 9 3 8 200 9 50 9 8 40 100 60 500 1 5 8 30 5 90 5 3 8 200 4 300 40 5 50 100 3 8 4 1 100 9 100 200 4 5 100 200 1 7 5 100 100 200 300 50 4 5 300 50 4 50 9 3 8 200 4 9 5 800 5 9 200 4 5 90 50 1 3 8 200
Hier die Ergebnissausgabe mit debug Ergebnis aus i_erg und dem Rest nach der Division:
[Gerechnet auf Maschiene A]
Code: Alles auswählen
divisor 3
(4)1 (190)1 (15)0 (9)0 (8)2 (29)2 (230)2 (26)2 (25)1 (150)0 (7)1 (19)1 (12)0 (200)2 (25)1 (1100)2 (2300)2 (240)0 (4)1 (19)1 (15)0 (500)2 (21)0 (8)2 (290)2 (28)1 (15)0 (9)0 (200)2 (2800)1 (1300)1 (15)0 (90)0 (20)2 (25)1 (150)0 (50)2 (25)1 (150)0 (300)0 (50)2 (24)0 (400)1 (19)1 (15)0 (90)0 (2)2 (25)1 (14)2 (29)2 (250)1 (17)2 (2300)2 (250)1 (17)2 (25)1 (150)0 (100)1 (19)1 (150)0 (4)1 (1800)0 (300)0 (2)2 (25)1 (11)2 (23)2 (28)1 (1200)0 (5)2 (250)1 (1300)1 (140)2 (2100)0 (9)0 (5)2 (2800)1 (1300)1 (15)0 (90)0 (6)0 (1)1 (18)0 (90)0 (5)2 (250)1 (14)2 (25)1 (150)0 (50)2 (25)1 (1100)2 (2100)0 (200)2 (25)1 (18)0 (200)2 (27)0 (5)2 (2100)0 (3)0 (8)2 (290)2 (29)2 (25)1 (12)0 (5)2 (250)1 (19)1 (18)0 (90)0 (500)2 (25)1 (190)1 (14)2 (25)1 (1200)0 (40)1 (19)1 (13)1 (18)0 (100)1 (1300)1 (13)1 (18)0 (5)2 (250)1 (1300)1 (150)0 (4)1 (16)1 (19)1 (150)0 (4)1 (15)0 (50)2 (24)0 (5)2 (250)1 (150)0 (500)2 (25)1 (150)0 (50)2 (29)2 (28)1 (190)1 (140)2 (29)2 (23)2 (28)1 (1400)2 (260)2 (250)1 (17)2 (21)0 (50)2 (2800)1 (15)0 (40)1 (18)0 (5)2 (290)2 (2800)1 (15)0 (50)2 (2100)0 (300)0 (3)0 (8)2 (25)1 (150)0 (500)2 (25)1 (190)1 (14)2 (25)1 (1200)0 (100)1 (160)1 (1500)0 (9)0 (30)0 (30)0 (9)0 (3)0 (8)2 (240)0 (9)0 (3)0 (8)2 (2400)0 (60)0 (50)2 (25)1 (1300)1 (13)1 (18)0 (6)0 (9)0 (50)2 (24)0 (5)2 (250)1 (130)1 (11)2 (2100)0 (100)1 (15)0 (50)2 (2300)2 (250)1 (14)2 (2500)1 (15)0 (90)0 (4)1 (15)0 (40)1 (1300)1 (15)0 (200)2 (29)2 (27)0 (9)0 (100)1 (1200)0 (100)1 (19)1 (15)0 (8)2 (25)1 (14)2 (25)1 (140)2 (27)0 (5)2 (22)1 (15)0 (9)0 (3)0 (8)2 (240)0 (5)2 (29)2 (250)1 (15)0 (7)1 (150)0 (1)1 (14)2 (25)1 (1100)2 (270)0 (90)0 (9)0 (3)0 (8)2 (2200)1 (14)2 (25)1 (190)1 (18)0 (5)2 (290)2 (290)2 (2300)2 (250)1 (14)2 (24)0 (5)2 (290)2 (290)2 (2300)2 (26)2 (24)0 (5)2 (2100)0 (7)1 (15)0 (9)0 (100)1 (1200)0 (5)2 (2100)0 (1)1 (150)0 (10)1 (15)0 (50)2 (25)1 (14)2 (29)2 (25)1 (19)1 (140)2 (2200)1 (160)1 (14)2 (25)1 (1100)2 (29)2 (250)1 (14)2 (29)2 (2100)0 (200)2 (24)0 (9)0 (5)2 (2100)0 (5)2 (290)2 (250)1 (11)2 (28)1 (1200)0 (5)2 (2300)2 (23)2 (28)1 (1800)0 (300)0 (7)1 (160)1 (1200)0 (200)2 (2100)0 (60)0 (50)2 (21)0 (8)2 (2200)1 (15)0 (90)0 (100)1 (19)1 (13)1 (18)0 (800)2 (2300)2 (25)1 (1300)1 (13)1 (18)0 (300)0 (50)2 (24)0 (4)1 (15)0 (90)0 (1)1 (140)2 (2200)1 (11)2 (27)0 (5)2 (2500)1 (11)2 (250)1 (14)2 (25)1 (130)1 (1200)0 (4)1 (15)0 (90)0 (100)1 (1200)0 (60)0 (5)2 (2100)0 (100)1 (1200)0 (100)1 (19)1 (13)1 (18)0 (50)2 (29)2 (23)2 (28)1 (1200)0 (4)1 (15)0 (50)2 (250)1 (15)0 (100)1 (19)1 (1100)2 (2200)1 (14)2 (21)0 (100)1 (130)1 (19)1 (13)1 (18)0 (200)2 (29)2 (250)1 (19)1 (18)0 (40)1 (1100)2 (260)2 (2500)1 (11)2 (25)1 (18)0 (30)0 (5)2 (290)2 (25)1 (13)1 (18)0 (200)2 (24)0 (300)0 (40)1 (15)0 (50)2 (2100)0 (3)0 (8)2 (24)0 (1)1 (1100)2 (29)2 (2100)0 (200)2 (24)0 (5)2 (2100)0 (200)2 (21)0 (7)1 (15)0 (100)1 (1100)2 (2200)1 (1300)1 (150)0 (4)1 (15)0 (300)0 (50)2 (24)0 (50)2 (29)2 (23)2 (28)1 (1200)0 (4)1 (19)1 (15)0 (800)2 (25)1 (19)1 (1200)0 (4)1 (15)0 (90)0 (50)2 (21)0 (3)0 (8)2 (2200)1
[Gerechnet auf Maschiene B]
Hier ist an Stelle 7 mit der Zahl 230 als Teilergebnis 229 angegeben was falsch ist da sollte nach:
Code: Alles auswählen
i_log = log10(*i_ptr)+1; *i_ptr = 30
i_erg = (*i_ptr + (pow ( 10, i_log ) * i_rest )); i_rest = 2
dass sollte für i_erg 230 nicht 229 ergeben.
... Warum???
Code: Alles auswählen
divisor 3
(4)1 (190)1 (15)0 (9)0 (8)2 (29)2 (229)1 (16)1 (15)0 (50)2 (27)0 (9)0 (2)2 (2200)1 (15)0 (100)1 (1300)1 (140)2 (24)0 (9)0 (5)2 (2500)1 (11)2 (28)1 (190)1 (18)0 (5)2 (29)2 (2200)1 (1800)0 (300)0 (5)2 (290)2 (219)0 (5)2 (249)0 (50)2 (25)1 (150)0 (300)0 (50)2 (24)0 (400)1 (19)1 (15)0 (90)0 (2)2 (25)1 (14)2 (29)2 (249)0 (7)1 (1300)1 (150)0 (7)1 (15)0 (50)2 (2100)0 (9)0 (50)2 (24)0 (800)2 (2300)2 (22)1 (15)0 (1)1 (13)1 (18)0 (200)2 (25)1 (150)0 (300)0 (40)1 (1100)2 (29)2 (25)1 (1800)0 (300)0 (5)2 (290)2 (26)2 (21)0 (8)2 (290)2 (25)1 (150)0 (4)1 (15)0 (50)2 (249)0 (5)2 (2100)0 (100)1 (1200)0 (5)2 (28)1 (1200)0 (7)1 (15)0 (100)1 (13)1 (18)0 (90)0 (9)0 (5)2 (22)1 (15)0 (50)2 (29)2 (28)1 (190)1 (1500)0 (5)2 (290)2 (24)0 (5)2 (2200)1 (140)2 (29)2 (23)2 (28)1 (1100)2 (2300)2 (23)2 (28)1 (15)0 (50)2 (2300)2 (249)0 (4)1 (16)1 (19)1 (150)0 (4)1 (15)0 (50)2 (24)0 (5)2 (249)0 (50)2 (2500)1 (15)0 (50)2 (249)0 (9)0 (8)2 (290)2 (239)2 (29)2 (23)2 (28)1 (1400)2 (260)2 (249)0 (7)1 (11)2 (249)0 (800)2 (25)1 (140)2 (28)1 (15)0 (90)0 (800)2 (25)1 (150)0 (100)1 (1300)1 (13)1 (18)0 (5)2 (249)0 (500)2 (25)1 (190)1 (14)2 (25)1 (1200)0 (100)1 (160)1 (1500)0 (9)0 (30)0 (30)0 (9)0 (3)0 (8)2 (239)2 (29)2 (23)2 (28)1 (1400)2 (260)2 (249)0 (5)2 (2300)2 (23)2 (28)1 (16)1 (19)1 (150)0 (4)1 (15)0 (50)2 (229)1 (11)2 (2100)0 (100)1 (15)0 (50)2 (2300)2 (249)0 (4)1 (1500)0 (5)2 (290)2 (24)0 (5)2 (239)2 (2300)2 (25)1 (1200)0 (9)0 (7)1 (19)1 (1100)2 (2200)1 (1100)2 (29)2 (25)1 (18)0 (5)2 (24)0 (5)2 (239)2 (27)0 (5)2 (22)1 (15)0 (9)0 (3)0 (8)2 (239)2 (25)1 (19)1 (150)0 (5)2 (27)0 (50)2 (21)0 (4)1 (15)0 (100)1 (170)2 (290)2 (29)2 (23)2 (28)1 (1200)0 (4)1 (15)0 (90)0 (8)2 (25)1 (190)1 (190)1 (1300)1 (150)0 (4)1 (14)2 (25)1 (190)1 (190)1 (1300)1 (16)1 (14)2 (25)1 (1100)2 (27)0 (5)2 (29)2 (2100)0 (200)2 (25)1 (1100)2 (21)0 (50)2 (209)2 (25)1 (150)0 (5)2 (24)0 (9)0 (5)2 (29)2 (239)2 (2200)1 (160)1 (14)2 (25)1 (1100)2 (29)2 (249)0 (4)1 (19)1 (1100)2 (2200)1 (14)2 (29)2 (25)1 (1100)2 (25)1 (190)1 (150)0 (1)1 (18)0 (200)2 (25)1 (1300)1 (13)1 (18)0 (800)2 (2300)2 (27)0 (60)0 (200)2 (2200)1 (1100)2 (260)2 (249)0 (1)1 (18)0 (200)2 (25)1 (190)1 (1100)2 (29)2 (23)2 (28)1 (1800)0 (300)0 (5)2 (2300)2 (23)2 (28)1 (1300)1 (150)0 (4)1 (14)2 (25)1 (190)1 (11)2 (239)2 (2200)1 (11)2 (27)0 (5)2 (2500)1 (11)2 (249)0 (4)1 (15)0 (30)0 (200)2 (24)0 (5)2 (290)2 (2100)0 (200)2 (260)2 (25)1 (1100)2 (2100)0 (200)2 (2100)0 (9)0 (3)0 (8)2 (249)0 (9)0 (3)0 (8)2 (2200)1 (14)2 (25)1 (150)0 (50)2 (25)1 (1100)2 (29)2 (2100)0 (200)2 (24)0 (1)1 (1100)2 (229)1 (19)1 (13)1 (18)0 (200)2 (29)2 (249)0 (9)0 (8)2 (239)2 (2100)0 (60)0 (500)2 (21)0 (5)2 (28)1 (130)1 (15)0 (90)0 (5)2 (23)2 (28)1 (1200)0 (4)1 (1300)1 (140)2 (25)1 (150)0 (100)1 (13)1 (18)0 (4)1 (11)2 (2100)0 (9)0 (100)1 (1200)0 (4)1 (15)0 (100)1 (1200)0 (1)1 (17)2 (25)1 (1100)2 (2100)0 (200)2 (2300)2 (249)0 (4)1 (15)0 (300)0 (50)2 (24)0 (50)2 (29)2 (23)2 (28)1 (1200)0 (4)1 (19)1 (15)0 (800)2 (25)1 (19)1 (1200)0 (4)1 (15)0 (90)0 (50)2 (21)0 (3)0 (8)2 (2200)1
Die Frage ist jetzt warum wird mir der Wert verhuntzt?
Verfasst: 15. Oktober 2006 18:44
von Christian81
Wie ich weiter oben schon gesagt habe - ist es evtl. ein alter Pentium mit FDIV-Bug?
Verfasst: 15. Oktober 2006 18:58
von 24dan
Wie erkenne ich eine alten Pentium???
Ich habe das schon auf zwei Maschinen ausprobiert was heisst alt?
Maschine A hat folgenden Pentium:
Intel(R)Pentium(R)M processor 1.50GHz
Treiberanbieter: MS
Treiberdatum: 01.04.2004
Treiberversion: 5.1.2600.0
Maschine B hat folgenden Pentium:
Intel(R)Pentium(R) 4 CPU 1.70GHz
Treiberanbieter: MS
Treiberdatum: 01.04.2004
Treiberversion: 5.1.2600.0
Das Problem grenzt sich wie folgt ein:
int *i_ptr = 30
int i_rest = 2
Code: Alles auswählen
int i_log = log10(*i_ptr)+1;
int i_erg = (*i_ptr + (pow ( 10, i_log ) * i_rest ));
Egal was davor der danach folgt hier sollte wenn die oben stehenden Parameter eingehen 230 nicht 229 rauskommen.
Fazit:
Die Log-fkt. scheint auch erstmal richtig.
Die Modulo fkt. ist wohl ebenfalls erstmal richtig.
Ich verstehe nicht wie da 229 rauskommen kann. Sind doch Integer???
Verfasst: 15. Oktober 2006 19:10
von Christian81
Ok, also kein alter Pentium...
Du solltest mal einTestproggi schreiben was dir auch alle Zwischenergebnisse dieser Operationen ausgibt.
Verfasst: 15. Oktober 2006 19:41
von 24dan
Ich habe jetzt die i_log funktion abgelöst durch:
Code: Alles auswählen
anzahl = 0;
if ( *i_ptr == 0) anzahl = 10;
if((*i_ptr >0) && (*i_ptr <=9))anzahl = 10;
if((*i_ptr >=10) && (*i_ptr <=99))anzahl = 100;
if((*i_ptr >=100) && (*i_ptr <=999))anzahl = 1000;
i_erg = (*i_ptr + (anzahl*i_rest)); // zum Teilerg. wird der rest von der letzten divison hinzuaddiert
// outfile<<"("<<i_erg<<")";
i_rest = i_erg%i_divisors; // rest ermitteln
// outfile<<i_rest<<" ";
Problem umgangen!!!