nProglänge is 4-byte unsigned int
progsize is 4-byte unsigned int
nProglänge = 100766
progsize = (( nProglänge / 128 ) + 1 ) * 128
// progsize = 100894 !!! falsch
progsize = nProglänge / 128
progsize += 1
progsize = progsize * 128
// progsize 100864 !! richtig
In dem ersten Beispiel wird das Ergebnis der Division offensichtlich nach REAL gewandelt, was weder
erwünscht noch nachvollziehbar ist.
Was kann der Grund dafür sein ?
Compiler Fehler ?
Re: Compiler Fehler ?
Die nachfolgende Hilfeseite für WinDev führt die Grundlagen für die unterschiedlichen Integers auf: http://help.windev.com/en-US/?1514049&n ... f_integers
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Re: Compiler Fehler ?
Ich konnte es gar nicht glauben, ist bei mir genau so...
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Re: Compiler Fehler ?
Aber eine Erklärung dafür finde ich da nicht.Lewi hat geschrieben:Die nachfolgende Hilfeseite für WinDev führt die Grundlagen für die unterschiedlichen Integers auf: http://help.windev.com/en-US/?1514049&n ... f_integers
-
- Site Admin
- Beiträge: 535
- Registriert: 23. Februar 2010, 08:06
- Wohnort: Langenthal, Schweiz
- Kontaktdaten:
Re: Compiler Fehler ?
Ehh?? Was wird denn da gerechnet???
100766/128=787.234375
+1 = 788.234375
788.234375*128=100894
Du rechnest 100766/128 und packst das in eine Integer. Abrunden! Da ist also eine mathematische Ungenauigkeit vorgegeben.
100766/128 muss als Ergenis real sein, wo wäre sonst die Genauigkeit? Umwandeln in Integer erwzingt ein Runden und provoziert ein vermeintlich falsches Ergebnis.
Du rundest ab auf 787. "Vergisst" also die Ungenauigkeit von 0.234375. Das Ganze * 128 ergibt die Differenz von genau 30. Die verschenkst einfach so und wirfst dem Compiler (eh der Mathematik) einen Fehler vor.
Deine Ueberlegungen sind falsch, der Compiler hat recht.
Wenn du es "falsch" willst, musst so rechnen:
So nebenbei würde ich nie Umlaute in Variablen verwenden. Gib mal den Code einem Engländer, der hat die Zeichen nicht auf der Tastatur.
100766/128=787.234375
+1 = 788.234375
788.234375*128=100894
Du rechnest 100766/128 und packst das in eine Integer. Abrunden! Da ist also eine mathematische Ungenauigkeit vorgegeben.
100766/128 muss als Ergenis real sein, wo wäre sonst die Genauigkeit? Umwandeln in Integer erwzingt ein Runden und provoziert ein vermeintlich falsches Ergebnis.
Du rundest ab auf 787. "Vergisst" also die Ungenauigkeit von 0.234375. Das Ganze * 128 ergibt die Differenz von genau 30. Die verschenkst einfach so und wirfst dem Compiler (eh der Mathematik) einen Fehler vor.
Deine Ueberlegungen sind falsch, der Compiler hat recht.
Wenn du es "falsch" willst, musst so rechnen:
Code: Alles auswählen
nProglänge is 4-byte unsigned int
nZiff,progsize are 4-byte unsigned int
rProgsize,rZiff are reals
nProglänge = 100766
rZiff=nProglänge / 128
nZiff=IntegerPart(rZiff)
Progsize = (nZiff + 1 ) * 128 //=100864