REAL auf INT wandeln

neibeck

Level-2
Beiträge
168
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

folgendes Problem: Will eine Gleitpunktzahl von Real auf Int wandeln. Bei positiven Zahlen funktioniert es mit RND, DTB, BTI...
aber wenn ich jetzt negative Zahlen habe, verliere ich das Vorzeichen, also statt -250 sinds dann 250...

Grund dafür dürfte sein dass bei DTB ein 32Bit BCD Format verwendet wird und dann bei BTI ein 16Bit benötigt wird. Da aber hier das Vorzeichen-Bit an einer anderen Stelle ist, geht es vermutlich verloren...

wie soll ich das lösen??

Sorry, bin Anfänger...

mfg
 
Ich verstehe das Problem nicht!:confused:

Folgender Code wandelt bei mir auch negative Zahlen korrekt um.

Code:
L     MD   100                    //Realzahl
RND   
T     MW   200                    //Integerzahl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hab mir das ganze jetzt mal durchgelesen und hab dann folgendes gefunden:


Code:
L MD 10    //REAL-Zahl 
RND                  //runden 
L DW#16#7FFFFFFF 
UD                   //DW-und 
T MD 2             //als DW speichern
//vorzeichenrichtige Zahl liegt in MW4
was genau bringt die UND-Verküpfung mit lauter Einsen? da kommt im Endeffekt ja wieder die selbe Zahl raus wie vor dem Vergleich oder?

Das richtige Ergebnis der INT-Zahl liegt dann praktisch in der zweiten Hälfte des MD2 oder?

mfg
 
@vierlagig:
Hast natürlich recht...:ROFLMAO:

[EDIT]
Aber was mich jetzt stutzig macht, es funktioniert bei mir wirklich so wie ich es oben gepostet habe. (eben mit PLCSIM getestet)
[/EDIT]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@4l: na und, wen störts?
Dein überheblicher Tonfall gefällt mir nicht ;)

Wenn der Bereich des Reals in einem Fenster von -32768.0 bis +32769.0 liegt funktioniert o.g. einwandfrei.

Ist der Realwert ausserhalb des Fenster muss man halt das DW auswerten...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hab mir das ganze jetzt mal durchgelesen und hab dann folgendes gefunden:


Code:
L MD 10    //REAL-Zahl 
RND                  //runden 
L DW#16#7FFFFFFF 
UD                   //DW-und 
T MD 2             //als DW speichern
//vorzeichenrichtige Zahl liegt in MW4
was genau bringt die UND-Verküpfung mit lauter Einsen? da kommt im Endeffekt ja wieder die selbe Zahl raus wie vor dem Vergleich oder?

Das richtige Ergebnis der INT-Zahl liegt dann praktisch in der zweiten Hälfte des MD2 oder?

mfg
wo hast Du den das her?

na, ja, wenn Du dann die zweite Hälfte des MD2 nimmst (das wäre dann MW4) ist das der richtige Integerwert. wofür zuvor aber dann das abschneiden, was sich etwas irreführend Vorzeichenbit nennt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so, öhm, ich geb mich geschlagen ... das problem liegt da wohl in meinem verqueren denken das zweierkomplement betreffend ... es ist zwar das erste bit, welches das vorzeichen bestimmt aber die zahl ist ja an sich schon negiert und um eins erhöht, dass heißt, dass vorzeichen steht, wenn die zahl im INT-wertebereich ist natürlich auch schon da ...

man lernt nie aus ... danke, dass ich nochmal drüber nachdenken durfte! :rolleyes:
 
Also, ich habe gerade mal mein SCL dazu befragt (SCL kennt immerhin eine Funktion REAL_TO_INT). Hier lautet das Ergebnis im Code auch schlicht und (un-)ergreifend :
Code:
L Real_Var
RND
T Int_Var
wobei sich ja um Wertebereichsgrenzen ja auch im Vorfeld gekümmert worden sein müßte ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
eine 32bit ganzzahl umfaßt, wie der name schon sagt, 32bit, die 16bit entsprechend 16.

ist die 32bit zahl kleiner gleich dem wertebereich der 16bit-ganzzahl kann man diese in den bereich einer 16bit zahl schreiben, das andere wort wird einfach abgeschnitten.

bei der negativen zahl handelt es sich um eine zahl im zweierkomplement und daher kann sie genauso wie eine positive im wertebereich der 16bit zahl behandelt werden. wichtig ist hier das erste bit, da steht das vorzeichen drin ... die erklärung dazu findest du in meinem letzten beitrag ...
 
Also, ich habe gerade mal mein SCL dazu befragt (SCL kennt immerhin eine Funktion REAL_TO_INT). Hier lautet das Ergebnis im Code auch schlicht und (un-)ergreifend :
Code:
L Real_Var
RND
T Int_Var
wobei sich ja um Wertebereichsgrenzen ja auch im Vorfeld gekümmert worden sein müßte ...

Gruß
LL

Ist ja auch logisch. Bei einer 32-Bit-Zahl ist das Vorzeichen in Bit 31, bei einer 16-Bit-Zahl in Bit 15. Durch das Zweierkomplement sind aber alle oberen und unbenutzten Bits 1. -1 ist zum Beispiel 0xFFFFFFFF als 32-Bit-Zahl und 0xFFFF als 16-Bit-Zahl. Wenn somit der Wertebereich von -32768 (= 0xFFFF8000) und 32767 (= 0x00007FFF) nicht überschritten wird, kann einfach obige Zuweisung erfolgen. Andernfalls steht sowieso Müll drin.
Ich kann nur jedem Konvertierer empfehlen, sich mit den Zahlen und deren internen und externen Darstellung zu befassen.
 
Zurück
Oben