Expotential in Fließkomma und zurück...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Expotential in Fließkomma und zurück...

Beitrag von Ghosty1967 »

Hallo zusammen...

Ich habe mal ein wenig rumgestöbert, aber leider keine Lösung für mein Problem gefunden - vielleicht weiß ja einer von Euch eine Lösung.

Also, ich habe eine Tabelle mit einer Reihe von Messwerten die ungefähr so aussieht
[img]
http://www.sfoerster.com/temp/table1.bmp
[/img]
Wie man erkennen kann stehen hier sowohl Werte im Wissenschaftlichen (Expotential) als auch im Fließkomma-Format.
Wenn ich mir diese Liste anschaue, möchte ich gerne zwischen einer von beiden Ansichten auswählen können.
Das heißt, ich brauche eine Routine, welche mir eine Wissenschaftliche Zahl in eine Fließkommazahl bzw. umgekehrt umwandeln kann.
Sinn der Sache ist es eigentlich nur die Lesbarkeit diese Tabelle zu erhöhen.

Hat einer eine Idee für mich oder einen Schnipsel?
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Ich weis nicht ob das Zufall ist, aber auf deinem Bild sind die Zahlen immer nur mit Potenzen zu sehen die durch 3 teilbar sind. Das währe nicht die wissenschaftliche sondern die technische Schreibweise (also E3,E6,...), hingegen die wissenschaftliche Schreibweise achtet Darauf das nur eine Zahl > 0 vor dem Komma steht und nimmt jede Potenz. (also E1,E2,E3,...).

Ansonst dürfte das nicht so schwer sein. Du versetzt das Komma bei der wissenschaftlichen Schreibweise so das nur eine Zahl vorne steht und hängst hinten ein E und die Anzahl Zeichen die du es nach vorne versetzt hast ran. Wenn du das Komma nach "hinten" versetzt, etwa bei besonders kleinen Zahlen musst du die Zahl eben negieren.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

hier n Procedure die die eine Zahl ins Wissenschaftliche übersetzt, also nur eine vorkommastelle:

Code: Alles auswählen


#Potenz = "*10^"

Procedure.s Format(Value.d, Length=-1)
 Position = Log10(Value)
 If Position
  NewValue.d = Value * Pow(10, -Position)
  If Length = -1
   ProcedureReturn StrD(NewValue)+#Potenz+Str(Position)
  Else
   ProcedureReturn StrD(NewValue, Length)+#Potenz+Str(Position)
  EndIf
 Else
  If Length = -1
   ProcedureReturn StrD(NewValue)
  Else
   ProcedureReturn StrD(NewValue, Length)
  EndIf
 EndIf
EndProcedure

Debug Format(1000)
Debug Format(#PI/180)
Debug Format(1.5e-20)

Debug Format(1000,1)
Debug Format(#PI/180,1)
Debug Format(1.5e-20,1)

PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Das ist ja schonmal nicht schlecht, allerdings brauche ich die Ausgabe in
folgendem Format :mrgreen:

Eingabe=0.00005432 Ausgabe=5.432E-5
Eingabe=0.0005432 Ausgabe=5.432E-4
Eingabe=0.005432 Ausgabe=5.432E-3
usw...
Eingabe=5.432 Ausgabe=5.432E0
Eingabe=54.32 Ausgabe=5.432E1
Eingabe=543.2 Ausgabe=5.432E2
usw...

Ich komme da irgendwie nicht weiter! :freak:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

[...]
Zuletzt geändert von HeX0R am 12.12.2008 10:16, insgesamt 1-mal geändert.
Little John

Beitrag von Little John »

So geht es "kurz, knackig und korrekt" ;-) und auch unter Berücksichtigung von Null und negativen Werten:

Code: Alles auswählen

; PB 4.30 beta 5
EnableExplicit

Procedure.s StrExp (value.d, decPlaces=-1)
   Protected s.s, p=0

   If value <> 0
      p = Round(Log10(Abs(value)), #PB_Round_Down)
      value * Pow(10, -p)
   EndIf
   If decPlaces = -1
      s = StrD(value)
   Else
      s = StrD(value, decPlaces)
   EndIf
   ProcedureReturn s + "E" + Str(p)
EndProcedure


;-- Demo
Debug StrExp(1)
Debug StrExp(27)
Debug StrExp(321)

Debug StrExp(1, 2)
Debug StrExp(27, 2)
Debug StrExp(321, 2)

Debug "---------------"

Debug StrExp(1.234)
Debug StrExp(12.34)
Debug StrExp(123.4)

Debug StrExp(1.234, 2)
Debug StrExp(12.34, 2)
Debug StrExp(123.4, 2)

Debug "---------------"

Debug StrExp(0.001234)
Debug StrExp(0.01234)
Debug StrExp(0.1234)

Debug StrExp(0.001234, 2)
Debug StrExp(0.01234, 2)
Debug StrExp(0.1234, 2)

Debug "---------------"

Debug StrExp(0)
Debug StrExp(0, 2)

Debug "---------------"

Debug StrExp(-0.001234)
Debug StrExp(-0.01234)
Debug StrExp(-0.1234)

Debug StrExp(-0.001234, 2)
Debug StrExp(-0.01234, 2)
Debug StrExp(-0.1234, 2)

Debug "---------------"

Debug StrExp(-1.234)
Debug StrExp(-12.34)
Debug StrExp(-123.4)

Debug StrExp(-1.234, 2)
Debug StrExp(-12.34, 2)
Debug StrExp(-123.4, 2)

Debug "---------------"

Debug StrExp(-1)
Debug StrExp(-27)
Debug StrExp(-321)

Debug StrExp(-1, 2)
Debug StrExp(-27, 2)
Debug StrExp(-321, 2)
Gruß, Little John
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Das sieht sehr gut aus...
Mußte noch ein wenig dran basteln, da ich eine ganz spezielle Ausgabe brauche.
Meine wissenschaftlichen Zahlen MÜSSEN IMMER in der Form
5.85E00
5.85E01
5.85E-02
usw... angezeigt werden. Also müssen alle folgenden Nullen abgeschnitten
werden und der Exponent muß immer Zweistellig angezeigt werden. Der Hintergrund
ist eine Auswertesoftware im Vakuumbereich bis 1E-12 mbar, welche die Werte
in eine Tabelle ablegt. Diese Werte werden bis 1E-6 als Fließkomma und
darunter als Expotentialwert eingetragen (keine Ahnung was das soll) :lol:
Ich habe Deinen Code mal zurecht gebastelt und so klappts!
Nur müßte ich nun auch noch das ganze wieder zurückwandeln können, da
man sich die Werte entweder als Exponent oder als Fließkommazahl anzeigen
könne soll.

Hier Dein Schnipsel auf meine Bedürfnisse angepasst...

Code: Alles auswählen

Procedure.s StrExp (Value.d)
  Protected s.s, p=0, i.l
  
  If Value <> 0
    p = Round(Log10(Abs(Value)), #PB_Round_Down)
    Value * Pow(10, -p)
  EndIf
  s = StrD(Value)
  ;Nachfolgende Nullen (aus StrD) abschneiden
  For i=Len(s) To 1 Step-1: If Mid(s,i,1)<>"0": s=Left(s,i): Break: EndIf: Next
  ;Wenn Ganzzahl, dann die "0" hinter das Komma setzen
  If p<>0
    ProcedureReturn s + "E" + RSet(Str(p),2,"0")
  Else  
    ProcedureReturn s + "0E" + RSet(Str(p),2,"0")
  EndIf
EndProcedure
Jetzt werde ich mich an dem Zurückwandeln versuchen... THX ! :allright:
Little John

Beitrag von Little John »

Ghosty1967 hat geschrieben:Mußte noch ein wenig dran basteln, da ich eine ganz spezielle Ausgabe brauche.
Meine wissenschaftlichen Zahlen MÜSSEN IMMER in der Form
5.85E00
5.85E01
5.85E-02
usw... angezeigt werden. Also müssen alle folgenden Nullen abgeschnitten
werden und der Exponent muß immer Zweistellig angezeigt werden.
Hmm ... ist nicht weiter schlimm, aber warum hast Du das nicht gleich gesagt? Vorher hattest Du geschrieben:
allerdings brauche ich die Ausgabe in
folgendem Format :mrgreen:

Eingabe=0.00005432 Ausgabe=5.432E-5
Eingabe=0.0005432 Ausgabe=5.432E-4
Eingabe=0.005432 Ausgabe=5.432E-3
usw...
Eingabe=5.432 Ausgabe=5.432E0
Eingabe=54.32 Ausgabe=5.432E1
Eingabe=543.2 Ausgabe=5.432E2
usw...
... was ja nicht das gleiche ist.

Gruß, Little John
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Stimmt definitiv... ist mir erst hinterher eingefallen oder ich werde alt :wink:
Antworten