Berechnungsdauern von Datentypen

JJJones

Level-2
Beiträge
31
Reaktionspunkte
0
Hallo zusammen,
ich wollte mal herausfinden, wie lange meine cpu benötigt, um zb ein double oder eine realzahl auszurechnen.
Hierfür möchte ich einfach eine for schleife machen in der eine Zahl immer aufaddiert wird. Anhand der Schleifendurchläufe die ich vorgebe und der Anzahl der Additionen in der Schleife könnte ich doch dann ausrechnen, wie lange des gedauert hat, um eine Berechnung durchzuführen(natürlich benötige ich hierzu noch die Zykluszeit) welche ich ja auch selbst in Codesys vorgeben kann.
Was passiert hier nun wenn es einen Überlauf des Wertebereiches gibt?
Wird dann einfach wieder von Null angefangen oder muss ich am Ende der Schleife meine Zahl wieder auf null setzen ?
Vielleicht hat jemand auch eine einfachere Idee wie ich diese Zeiten ermitteln könnte.

Gruß
JJJones
 
Bei Ganzzahl-Addition (INT, DINT) kann ein Überlauf auftreten, den Du aber einfach ignorieren kannst.
Bei REAL wird es sehr wahrscheinlich keinen Überlauf geben, weil wenn sich die Größe der Summanden um mehr als 7 Zehnerpotenzen unterscheidet dann ergibt A + B wieder A (oder B) und die Summe wird nicht mehr größer.

Wenn Du den Überlauf sicher ausschließen willst dann könntest Du auch einfach immer 0 addieren :cool: (Du musst die Addition von 0 nur so formulieren, daß der Compiler sie nicht wegoptimiert)
Code:
Summand := 0;
Summe := 0;
FOR i := 0 TO 10000
  Summe := Summe + Summand;
END_FOR

//Test was passiert bei Überlauf?
iSumme := 30000;
iSumme := iSumme + iSumme + 30000;

Harald
 
Danke für die Hilfe,
jetzt würde mich aber noch interisieren was bei dem Überlauf eigentlich passiert. Wird hier weiteraddiert, aber man sieht das Ergebniss nicht mehr, oder wird die Addition garnich erst ausgeführt ?
 
Danke für die Hilfe,
jetzt würde mich aber noch interisieren was bei dem Überlauf eigentlich passiert. Wird hier weiteraddiert, aber man sieht das Ergebniss nicht mehr, oder wird die Addition garnich erst ausgeführt ?
Wenn die verfügbaren Bits verbraucht sind, wie soll er da dann weiter addieren?
Überlauf heißt, dass er bei einer Addition mit positiven Zahlen bei vorzeichenbehafteten Variablen auf den kleinsten Wert springt und von da weiterzählt. Bei einem USINT wäre der maximal mögliche Wert 127, bei einer Addition mit 1 springt er auf -128, bei einer Addition mit 4 entsprechend auf -125. Bei Variablen ohne Vorzeichen springt er entsprechend auf 0. Bei einer Substraktion springt er auf den höchsten Wert, um bei obigen Beispiel zu bleiben also auf 127, bzw. 124.

Von irgendwas mit Internetzugang gesendet
 
Nachtrag: Ein Computer/eine Steuerung verarbeitet ja letztenendes nur 0 und 1 und jeder Variablentyp hat davon nur eine bestimmte Anzahl zur Verfügung. Ein USINT besteht z.B. aus 8 Bits kann also, in dezimaler Schreibweise dargestellt, Zahlenwerte von 0-255 aufnehmen. Sind alle benutzt, in dem Falle also auf 1 sprich der Speicher enthält 1111 1111 verursacht eine Addition von >0 einen so genannten Überlauf. Bei einer Addition mit 1 käme in binärer Schreibweise eigentlich 1 0000 0000 raus, da aber nur 8 Bits zur Verfügung stehen bleibt nur 0000 0000 über. Bei manchen Systemen wird in einem solchen Fall ein Überlauf-Flag (Overflow) gesetzt. Bei Zahlen mit Vorzeichen ist die Sache mit der binären Darstellung und wann ein Über-, bzw. Unterlauf stattfindet etwas anders. Das höchstwertige Bit ist das Vorzeichen, ist dies 1 handelt es sich um eine negative Zahl. Bei einer 8 Bit breiten Variable die einen Bereich von -128 - 127 hat würde bei 127 im Speicher 0111 1111 stehen. Die negativen Zahlen werden im sogenannten Zweierkomplement dargestellt, addiert man dazu nun 1 sieht es im Speicher so aus, als würde dort tatsächlich 128 stehen, denn der Wert wurde tatsächlich um 1 Bit erhöht und im Speicher steht nun 1000 0000. Da es aber eine Vorzeichen behaftete Variable ist und jetzt das höchstwertige Bit 1 ist, handelt es sich um eine Negative Zahl die, wie erwähnt, als Zweierkompliment gespeichert wird, somit wird der Wert -128 angezeigt. Eine -1 würde im Speicher übrigens als 1111 1111 gespeichert.

Von irgendwas mit Internetzugang gesendet
 
Hallo zusammen,
ich wollte mal herausfinden, wie lange meine cpu benötigt, um zb ein double oder eine realzahl auszurechnen.
Also mal zwei separate Probleme mit deinem Vorhaben:
Hierfür möchte ich einfach eine for schleife machen in der eine Zahl immer aufaddiert wird.
Also ich glaube nicht, daß du damit realistische Werte erzielst. Denn sowohl moderne Prozessoren als auch moderne Compiler schalten da so viele optimierungen dazwischen, daß du kaum noch Schlüsse aus den Werten erzielen kannst.
Was passiert hier nun wenn es einen Überlauf des Wertebereiches gibt?
Wird dann einfach wieder von Null angefangen oder muss ich am Ende der Schleife meine Zahl wieder auf null setzen?
Also bei Integer-Variablen (INT, DINT etc.) bewirkt ein Überlauf am Ende des Datentyps, daß du am Anfang wieder anfängst, bei INT z.B. springt es von 32767 auf -32768. Das kannst du gut beobachten, wenn du in jedem Zyklus einmalig +1 berechnest, da kann man bei typischen Zykluszeiten gut zuschauen.

Bei REAL/DOUBLE-Variablen verhält sich das anders, weil der Wertebereich je nach Größe des vorhandenen Wertes sich verschiebt (floating point). Dabei gibt es einen Punkt, wo eine Erhöhung um +1 den Wert nicht mehr verändert (Rundungsfehler).
Also wenn dein Datentyp auf 7-8 Stellen genau rechnet, dann ist 1+1=2, aber 1Mrd+1=1Mrd
 
Zurück
Oben