Gleitpunktzahl zerlegen

Heri

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das Thema gab es zwar schon einmal, aber hat so nicht funktioniert:
Ich möchte eine Gleitpunktzahl getrennt als Mantisse und Exponent
anzeigen, dabei soll die Mantisse auf eine Stelle vor und nach dem Komma
begrenzt werden. Der Exponent mit Vorzeichen; alles zur Basis 10.
Ich könnte das Ganze mit Vergleichen und Umrechnen gestalten,
ist aber sehr umständlich;vielleicht gibts etwas Einfacheres.
Ich arbeite mit Step7V5.3 und CPU315-2 DP.
Viele Grüße, Heri
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, genau, hier auch der Vorschlag damals von Jochen Kühner:

L ED 1 //Eingangswort
L DW#16#7F800000 //maskieren des exponenten
SRD 23
T EXPONENT

L ED 1
L DW#16#7FFFFF
T MANTISSE
 
ja klar da fehlt das UD
Code:
      L     ED     1                    //Eingangswort
      L     DW#16#7F800000              //maskieren des exponenten
      UD    
      SRD   23
      L     127
      -D    
      T     #EXPONENT
 
      L     ED     1
      L     DW#16#7FFFFF
      UD    
      T     #MANTISSE

aber das löst leider das Problem noch nicht, die Mantisse ist so aufgebaut
22es Bit 2^-1
21es Bit 2^-2
.
.
.
0es Bit 2^-23

wenn ich mal Zeit habe überlege ich es mir.

Eine Gleitpunktzahl schaut so aus:

1,Mantisse * 2 ^ (Exponent-127)
 
Zuletzt bearbeitet:
Ok, funktioniert anders:

Das ist mal der Exponent:

Code:
   L     ED     1
      LN    
      L     2.302585e+000
      /R    
      RND-  
      T     #EXPONENT

An der Mantisse arbeite ich noch...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So etwa funktioniert das:

Code:
     L     ED     1
      ABS   
      LN    
      L     2.302585e+000
      /R    
      RND-  
      T     #EXPONENT                   //Exponent
      DTR   
      T     #W1                         //Tempvariable 
 
      L     1.000000e+001
      LN    
      L     #W1
      *R    
      EXP       //= 10 hoch Exponent
                  
      L     ED     1
     TAK
      /R    
      L     1.000000e+001
      *R    
      RND   
      T     #MANTISSE                   //10 x Mantisse als Integerzahl

Die Mantisse wolltest Du in Integer mit einer Vor- und Nachkommastelle... also habe ich diese mit 10 multipliziert.
 
Hallo borromeus,
Deine Lösung funktioniert einwandfrei; werde mal versuchen,
dies nachzuvollziehen.
Vielen herzlichen Dank dafür !
Viele Grüße, Heri
 
Bereich

Zur Vollständigkeit:


Das ganze funktioniert - für Exponent und Mantisse als Integer [Integer war ja gefragt] - natürlich nur im

REAL-ROH-Wertebereich von -3276.8 bis 3276.7 sonst gibts Überläufe.

D.h. der Eingangsbereich sollte entsprechend auf Überläufe überwacht
werden sofern sie - wenn auch selten - eintreten können.


Ansonsten eine schönes Beispiel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Vollständigkeit:


Das ganze funktioniert - für Exponent und Mantisse als Integer [Integer war ja gefragt] - natürlich nur im

REAL-ROH-Wertebereich von -3276.8 bis 3276.7 sonst gibts Überläufe.

D.h. der Eingangsbereich sollte entsprechend auf Überläufe überwacht
werden sofern sie - wenn auch selten - eintreten können.


Ansonsten eine schönes Beispiel
Verstehe ich nicht!
Stehe offensichtlich heute den ganzen Tag auf der Leitung...
Kannst Du ein Beispiel nennen?
 
Bereich, wenn EXPONENT und MANTISSE vom Typ INT

maximaler Wert (richtig)
REAL 3276.7 EXP (von Typ INT) 3 MANT (von Typ INT) 32768

noch größer (dann falsch)
REAL 3276.8 EXP (von Typ INT) 3 MANT (von Typ INT) -32768

----------------------------------------------------------------------

minimaler Wert (richtig)
REAL -3276.8 EXP (von Typ INT) 3 MANT (von Typ INT) -32768

noch kleiner (dann falsch)
REAL -3276.9 EXP (von Typ INT) 3 MANT (von Typ INT) 32768




Das bedeutet, dass der Wunsch - Werte in INTEGER-Variablen für die Umwandlung zu verwenden - nur eingeschränkt sinnvoll ist.
 
Zuletzt bearbeitet:
Der Exponent ein Gleitpunktzahl kann +/- 38 sein.
Die Mantisse soll auf eine Vor- und eine Nachkommastelle genau sein- wurde mit 10 multipliziert: Bereich daher -99 bis +99
Bei 32 Bitzahlen ginge das aber auch bis +/- 2 Milliarden
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
gerade probiert - komisch

VAT


REAL 9.9e+013 EXP = 13 MANISSE = 6550

REAL -9.9e+011 EXP = 11 MANISSE = 4192




Nochmal der CODE:


L "MD0" //Typ REAL
ABS
LN
L 2.302585e+000
/R
RND-
T #EXPONENT //Exponent
DTR
T #W1 //Tempvariable
L 1.000000e+001
LN
L #W1
*R
EXP //= 10 hoch Exponent
L "MD0"
TAK
/R
L 1.000000e+001
*R
RND
T #MANTISSE //10 x Mantisse als Integerzahl


L #EXPONENT
T "EXPO" //Typ INT
L #MANTISSE
T "MANT" //Typ INT
 
"MD0" vom Typ REAL wird in der VAT manuell gesetzt, nicht direkt im Code

oder

habe ich nochwas anderes übersehen ???
 
Zurück
Oben