Autor Beitrag
Killmag10
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 297

Suse Linux / DOS / Windows All In One ;)
D4 / D2005
BeitragVerfasst: Mo 06.06.05 18:24 
Hi bin beim progen auf was komisches gestoßen...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
zahl:real;
begin
zahl:=0;
for i:=0 to 500 do begin+
zahl:=zahl+0.1;
memo1.Lines.Add(floattostr(zahl));
end;


wenn ich das ausfüre spuckt mir delphi folgendes aus:

ausblenden volle Höhe Quelltext
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:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1
1,1
1,2
1,3
1,4
1,5
1,6
1,7
1,8
1,9
2
2,1
2,2
2,3
2,4
2,5
2,6
2,7
2,8
2,9
3
3,1
3,2
3,3
3,4
3,5
3,6
3,7
3,8
3,9
4
4,1
4,2
4,3
4,4
4,5
4,6
4,7
4,8
4,9
5
5,1
5,2
5,3
5,4
5,5
5,6
5,7
5,8
5,9
5,99999999999999
6,09999999999999
6,19999999999999
6,29999999999999
6,39999999999999
6,49999999999999
6,59999999999999
6,69999999999999
6,79999999999999
6,89999999999999
6,99999999999999
7,09999999999999
7,19999999999999
7,29999999999999
7,39999999999999
7,49999999999999
7,59999999999999
7,69999999999999
7,79999999999999
7,89999999999999
7,99999999999999
8,09999999999999
8,19999999999999
8,29999999999999
8,39999999999999
8,49999999999999
8,59999999999999
8,69999999999999
8,79999999999998
8,89999999999998
8,99999999999998
9,09999999999998
9,19999999999998
9,29999999999998
9,39999999999998
9,49999999999998
9,59999999999998
9,69999999999998
9,79999999999998
9,89999999999998
9,99999999999998
10,1
10,2
10,3
10,4
10,5
10,6
10,7
10,8
10,9
11
11,1
11,2
11,3
11,4
11,5
11,6
11,7
11,8
11,9
12
12,1
12,2
12,3
12,4
12,5
12,6
12,7
12,8
12,9
13
13,1
13,2
13,3
13,4
13,5
13,6
13,7
13,8
13,9
14
14,1
14,2
14,3
14,4
14,5
14,6
14,7
14,8
14,9
15
15,1
15,2
15,3
15,4
15,5
15,6
15,7
15,8
15,9
16
16,1
16,2
16,3
16,4
16,5
16,6
16,7
16,8
16,9
17
17,1
17,2
17,3
17,4
17,5
17,6
17,7
17,8
17,9
18
18,1
18,2
18,3
18,4
18,5
18,6
18,7
18,8
18,9
19
19,1
19,2
19,3
19,4
19,5
19,6
19,7
19,8
19,9
20
20,1
20,2
20,3
20,4
20,5
20,6
20,7
20,8
20,9
21
21,1
21,2
21,3
21,4
21,5
21,6
21,7
21,8
21,9
22
22,1
22,2
22,3
22,4
22,5
22,6000000000001
22,7000000000001
22,8000000000001
22,9000000000001
23,0000000000001
23,1000000000001
23,2000000000001
23,3000000000001
23,4000000000001
23,5000000000001
23,6000000000001
23,7000000000001
23,8000000000001
23,9000000000001
24,0000000000001
24,1000000000001
24,2000000000001
24,3000000000001
24,4000000000001
24,5000000000001
24,6000000000001
24,7000000000001
24,8000000000001
24,9000000000001
25,0000000000001
25,1000000000001
25,2000000000001
25,3000000000001
25,4000000000001
25,5000000000001
25,6000000000001
25,7000000000001
25,8000000000001
25,9000000000001
26,0000000000001
26,1000000000001
26,2000000000001
26,3000000000001
26,4000000000001
26,5000000000001
26,6000000000001
26,7000000000001
26,8000000000001
26,9000000000001
27,0000000000001
27,1000000000001
27,2000000000001
27,3000000000001
27,4000000000001
27,5000000000001
27,6000000000001
27,7000000000001
27,8000000000001
27,9000000000001
28,0000000000001
28,1000000000001
28,2000000000001
28,3000000000001
28,4000000000001
28,5000000000001
28,6000000000001
28,7000000000001
28,8000000000001
28,9000000000001
29,0000000000001
29,1000000000001
29,2000000000001
29,3000000000001
29,4000000000001
29,5000000000001
29,6000000000002
29,7000000000002
29,8000000000002
29,9000000000002
30,0000000000002
30,1000000000002
30,2000000000002
30,3000000000002
30,4000000000002
30,5000000000002
30,6000000000002
30,7000000000002
30,8000000000002
30,9000000000002
31,0000000000002
31,1000000000002
31,2000000000002
31,3000000000002
31,4000000000002
31,5000000000002
31,6000000000002
31,7000000000002
31,8000000000002
31,9000000000002
32,0000000000002
32,1000000000002
32,2000000000002
32,3000000000002
32,4000000000002
32,5000000000002
32,6000000000002
32,7000000000002
32,8000000000002
32,9000000000002
33,0000000000002
33,1000000000002
33,2000000000002
33,3000000000002
33,4000000000002
33,5000000000002
33,6000000000002
33,7000000000002
33,8000000000002
33,9000000000002
34,0000000000002
34,1000000000002
34,2000000000002
34,3000000000002
34,4000000000002
34,5000000000002
34,6000000000002
34,7000000000002
34,8000000000002
34,9000000000002
35,0000000000002
35,1000000000002
35,2000000000002
35,3000000000002
35,4000000000002
35,5000000000002
35,6000000000002
35,7000000000002
35,8000000000002
35,9000000000002
36,0000000000002
36,1000000000002
36,2000000000002
36,3000000000002
36,4000000000002
36,5000000000002
36,6000000000003
36,7000000000003
36,8000000000003
36,9000000000003
37,0000000000003
37,1000000000003
37,2000000000003
37,3000000000003
37,4000000000003
37,5000000000003
37,6000000000003
37,7000000000003
37,8000000000003
37,9000000000003
38,0000000000003
38,1000000000003
38,2000000000003
38,3000000000003
38,4000000000003
38,5000000000003
38,6000000000003
38,7000000000003
38,8000000000003
38,9000000000003
39,0000000000003
39,1000000000003
39,2000000000003
39,3000000000003
39,4000000000003
39,5000000000003
39,6000000000003
39,7000000000003
39,8000000000003
39,9000000000003
40,0000000000003
40,1000000000003
40,2000000000003
40,3000000000003
40,4000000000003
40,5000000000003
40,6000000000003
40,7000000000003
40,8000000000003
40,9000000000003
41,0000000000003
41,1000000000003
41,2000000000003
41,3000000000003
41,4000000000003
41,5000000000003
41,6000000000003
41,7000000000003
41,8000000000003
41,9000000000003
42,0000000000003
42,1000000000003
42,2000000000003
42,3000000000003
42,4000000000003
42,5000000000003
42,6000000000003
42,7000000000003
42,8000000000003
42,9000000000003
43,0000000000003
43,1000000000003
43,2000000000003
43,3000000000003
43,4000000000003
43,5000000000003
43,6000000000003
43,7000000000004
43,8000000000004
43,9000000000004
44,0000000000004
44,1000000000004
44,2000000000004
44,3000000000004
44,4000000000004
44,5000000000004
44,6000000000004
44,7000000000004
44,8000000000004
44,9000000000004
45,0000000000004
45,1000000000004
45,2000000000004
45,3000000000004
45,4000000000004
45,5000000000004
45,6000000000004
45,7000000000004
45,8000000000004
45,9000000000004
46,0000000000004
46,1000000000004
46,2000000000004
46,3000000000004
46,4000000000004
46,5000000000004
46,6000000000004
46,7000000000004
46,8000000000004
46,9000000000004
47,0000000000004
47,1000000000004
47,2000000000004
47,3000000000004
47,4000000000004
47,5000000000004
47,6000000000004
47,7000000000004
47,8000000000004
47,9000000000004
48,0000000000004
48,1000000000004
48,2000000000004
48,3000000000004
48,4000000000004
48,5000000000004
48,6000000000004
48,7000000000004
48,8000000000004
48,9000000000004
49,0000000000004
49,1000000000004
49,2000000000004
49,3000000000004
49,4000000000004
49,5000000000004
49,6000000000004
49,7000000000004
49,8000000000004
49,9000000000004
50,0000000000004
50,1000000000004


hab gehört das das CPU im kommabereich nicht richtig rechnen kann aber hatt das so krasse auswirkungen ???

mfg. Killmag10

_________________
Mega-inkompetente Computer-ruinierende Organisation spioniert ohne funktionierende Technik
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mo 06.06.05 21:39 
an der cpu liegt das sicher nicht ... schau dir einfach mal an wie die zahlen in einem float gespeichert werden (google > mantisse würd ich mal sagen)

_________________
hans bist du das ?
Killmag10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 297

Suse Linux / DOS / Windows All In One ;)
D4 / D2005
BeitragVerfasst: Mi 08.06.05 15:05 
also ich bin ja jetzt immer noch nett weiter...

ist das nun ein fehler von Delphi oder basiert das bei jeder delphi version ???

und wenns kein fehler is wieso passiert das ???

_________________
Mega-inkompetente Computer-ruinierende Organisation spioniert ohne funktionierende Technik
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 08.06.05 15:53 
user profile iconKillmag10 hat folgendes geschrieben:
also ich bin ja jetzt immer noch nett weiter...

ist das nun ein fehler von Delphi oder basiert das bei jeder delphi version ???

und wenns kein fehler is wieso passiert das ???


Das ist kein Fehler - das liegt einfach daran, dass einige Zahlen, die sich im Dezimalsystem mit einer endlichen Zahl an Nachkommastellen darstellen lassen, im internen Fließkommaformat des Prozessors nicht genau abbilden lassen - genau wie z.B. 1/3 im Dezimalsystem zu 1,33333333.... wird. Dadurch schleichen sich bei Fließkommaoperationen Rundungsfehler ein.

Stefan
Killmag10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 297

Suse Linux / DOS / Windows All In One ;)
D4 / D2005
BeitragVerfasst: Mi 08.06.05 20:19 
user profile iconStefan.Buchholtz hat folgendes geschrieben:
user profile iconKillmag10 hat folgendes geschrieben:
also ich bin ja jetzt immer noch nett weiter...

ist das nun ein fehler von Delphi oder basiert das bei jeder delphi version ???

und wenns kein fehler is wieso passiert das ???


Das ist kein Fehler - das liegt einfach daran, dass einige Zahlen, die sich im Dezimalsystem mit einer endlichen Zahl an Nachkommastellen darstellen lassen, im internen Fließkommaformat des Prozessors nicht genau abbilden lassen - genau wie z.B. 1/3 im Dezimalsystem zu 1,33333333.... wird. Dadurch schleichen sich bei Fließkommaoperationen Rundungsfehler ein.

Stefan


also liegts doch am cpu...

und wie kann ich das am besten umgehen so das ich 100% genau rechnen kann ??? (ausgenommen viele kommastellen die das real format übersteigen)

gibts da ihrgent ne einfache lösung :?:

_________________
Mega-inkompetente Computer-ruinierende Organisation spioniert ohne funktionierende Technik
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 08.06.05 20:48 
user profile iconKillmag10 hat folgendes geschrieben:
user profile iconStefan.Buchholtz hat folgendes geschrieben:
user profile iconKillmag10 hat folgendes geschrieben:
also ich bin ja jetzt immer noch nett weiter...

ist das nun ein fehler von Delphi oder basiert das bei jeder delphi version ???

und wenns kein fehler is wieso passiert das ???


Das ist kein Fehler - das liegt einfach daran, dass einige Zahlen, die sich im Dezimalsystem mit einer endlichen Zahl an Nachkommastellen darstellen lassen, im internen Fließkommaformat des Prozessors nicht genau abbilden lassen - genau wie z.B. 1/3 im Dezimalsystem zu 1,33333333.... wird. Dadurch schleichen sich bei Fließkommaoperationen Rundungsfehler ein.

Stefan


also liegts doch am cpu...

und wie kann ich das am besten umgehen so das ich 100% genau rechnen kann ??? (ausgenommen viele kommastellen die das real format übersteigen)

gibts da ihrgent ne einfache lösung :?:


Nein, eine wirklich vollständige einfache Lösung gibt es nicht - es gibt in jedem Zahlensystem Brüche, die nicht durch eine endliche Zahl Nachkommastellen dargestellt werden können - im Dezimalsystem sind das zum Beispiel 1/3 und 1/7. Periodische Dezimalbrüche kennt die CPU nun mal nicht. Wenn dir ein Typ reicht, der sich wie eine Dezimalzahl verhält, kannst du Currency benutzen - das ist ein Festkommatyp mit 4 Nachkommastellen Genauigkeit, der - wie der Name schon sagt - für finanzmathematische Berechnungen gedacht ist. Bei dem tritt dieses Verhalten nicht auf. Die andere Möglichkeit ist, mit Fließkommatypen zu rechnen und in der Darstellung immer auf die gewünscte Anzahl von Stellen zu runden.

Stefan
Killmag10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 297

Suse Linux / DOS / Windows All In One ;)
D4 / D2005
BeitragVerfasst: Mi 08.06.05 21:38 
aber wieso tritt das eigendlich auch bei stinknormalen plus rechnen auf ???

ich teile ja nichts...

oder versteh ich da jetzt was falsch ???

_________________
Mega-inkompetente Computer-ruinierende Organisation spioniert ohne funktionierende Technik
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 08.06.05 23:48 
user profile iconKillmag10 hat folgendes geschrieben:
aber wieso tritt das eigendlich auch bei stinknormalen plus rechnen auf ???

ich teile ja nichts...

oder versteh ich da jetzt was falsch ???


Der Fehler tritt bei der Umrechnung vom Dezimal- ins Binärformat auf, nicht bei der Addition. Das passiert im Dezimalsystem auch, wenn man mit einer begrenzten Menge an Kommastellen rechnet und keine periodischen Dezimalbrüche zulässt: 1/3 + 1/3 + 1/3 = 1, aber 0,333333 + 0,333333 + 0,333333 = 0,999999. Die Addition ist jeweils richtig gerechnet, aber 1/3 ist nun mal nicht genau 0,33333.

Stefan
Killmag10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 297

Suse Linux / DOS / Windows All In One ;)
D4 / D2005
BeitragVerfasst: Do 09.06.05 00:20 
user profile iconStefan.Buchholtz hat folgendes geschrieben:
user profile iconKillmag10 hat folgendes geschrieben:
aber wieso tritt das eigendlich auch bei stinknormalen plus rechnen auf ???

ich teile ja nichts...

oder versteh ich da jetzt was falsch ???


Der Fehler tritt bei der Umrechnung vom Dezimal- ins Binärformat auf, nicht bei der Addition. Das passiert im Dezimalsystem auch, wenn man mit einer begrenzten Menge an Kommastellen rechnet und keine periodischen Dezimalbrüche zulässt: 1/3 + 1/3 + 1/3 = 1, aber 0,333333 + 0,333333 + 0,333333 = 0,999999. Die Addition ist jeweils richtig gerechnet, aber 1/3 ist nun mal nicht genau 0,33333.

Stefan


aso gut danke, jetzt hab ichs verstanden :wink:

_________________
Mega-inkompetente Computer-ruinierende Organisation spioniert ohne funktionierende Technik