Wandlung Real zu Int

Zuviel Werbung?
-> Hier kostenlos registrieren
Setzt kein OV, weil +I einfach nur die unteren 16-Bit von #zuIntZuWandelndeZahl nimmt. + 0 ergibt dann auf jeden Fall einen gültigen INT-Wert.
Wenn nach der + 0 allerdings das Ergebnis = #zuIntZuWandelndeZahl ist, dann ist #zuIntZuWandelndeZahl im für INT gültigen Bereich.

Harald

Das hatte Ich ja vermutet, das die I Funktionen auch die Akku Werte vor der Operation nur 16 Bit breit auswerten, und nicht erst das Ergebnis!

Aber die Prüfung:

Code:
      PUSH                      //DINT-Wert in Akku2 merken
      ITD                       //Akku1 INT -> DINT
      ==D

find Ich gut! Ich hab da immer die Obergrenze und Untergrenze verglichen...
 
Zuletzt bearbeitet:
Dies funktioniert, aber es kostet zweimal ein DINT vergleicher.
Code:
      L     MD   100
      RND   
      T     #diTEMP
      L     L#32767
      >D    
      JC    _er1
      L     #diTEMP
      L     L#-32768
      <D    
      JC    _er2
      L     #diTEMP
      T     MW   110
      JU    end
_er1: S     M     10.0                  // >32767
      JU    end
_er2: S     M     10.1                  // <-32768
      JU    end
end:  NOP   0
 
Dies funktioniert, aber es kostet zweimal ein DINT vergleicher.
Code:
      L     MD   100
      RND   
      T     #diTEMP
      L     L#32767
      >D    
      JC    _er1
      L     #diTEMP
      L     L#-32768
      <D    
      JC    _er2
      L     #diTEMP
      T     MW   110
      JU    end
_er1: S     M     10.0                  // >32767
      JU    end
_er2: S     M     10.1                  // <-32768
      JU    end
end:  NOP   0

So ähnlich mach Ich meine Bereichsprüfungen auch immer. Ich lade nur den zu vergleichenden Wert beim ersten >D als zweites und mach ein <=D draus, so muss Ich beim 2ten vergleich nur noch die zweite Grenze laden. (spart eine Zeile Code, juhu!). Aber beim Int Bereich vergleich ist die Lösung von Harald natürlich super!
 
Funktionierts, und belastet den CPU en klein bisschen weninger:

Code:
      L     MD   100
      RND   
      T     #diTEMP
      PUSH  
      ITD   
      ==D   
      JCN   _er1
      L     #diTEMP
      T     MW   110
      JU    end
_er1: S     M     10.0                  // >32767 / <-32768
end:  NOP   0

[Optimizer] - kann ich mir nicht verkneifen ;)
#diTEMP kann man weglassen. Und durch Umstellen einen Jump einsparen. Kürzer geht es dann wohl nicht mehr.
Code:
      L     MD   100
      RND   
      PUSH  
      ITD   
      <>D   
      =     M     10.0                  // >32767 / <-32768
      JC    end
      T     MW   110
end:  NOP   0
Ich muß zugeben, so sieht der Code schon ziemlich perfekt aus. ;):)

Harald
 
Was zu tun wenn etwas schief geht muss man ja entscheiden.
Einfach ignorieren ohne Warnung ist nach meiner Meinung nicht i.O.

PN/DP, ja sieht "perfekt" aus.
 
Zurück
Oben