Stringausgabe in Exponentialschreibweise

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Stringausgabe in Exponentialschreibweise

Beitrag von freedimension »

Ich habe das heute gebraucht und musste mir da etwas behelfen, da PB das nicht nativ kann ;(

Folgende Funktion wandelt eine Double-Variable in einen String um. Das Ausgabeformat ist dabei stets in der wissenschaftlichen Exponentialschreibweise (z.B. 1.23E-34) gehalten.

Code: Alles auswählen

; German forum: http://forums.purebasic.com/german/viewtopic.php?p=78868
; Author: freedimension
; Date: 26. Februar 2006
; OS: -
; Demo: No
; Version: PB 4.0

Procedure.s StrExp(d.d)
  Protected *sp.BYTE
  Protected result.s
  Protected exp.l, sign.l, margin.l

  If d < 0.0
    sign = -1
  Else
    sign = 1
  EndIf
  d = Abs(d)
  
  If d = 0.0
    result = "0.0E+0"
  Else
    If d < 1.0
      While d < 1.0
        d * 10.0
        exp - 1
      Wend
    ElseIf d >= 10.0
      While d >= 10.0
        d * 0.1
        exp + 1
      Wend
    EndIf
    If sign = -1
      result = "-"
    EndIf
    result + StrD(d, 20)
    
    len = Len(result)
    *sp = @result + len - 1
    
    While *sp\b = '0' And len > margin + 3
      margin + 1
      *sp - 1
    Wend
    result = Left(result, len - margin)
    
    result + "E"
    If exp < 0
      result + Str(exp)
    Else
      result + "+" +  Str(exp)
    EndIf
  EndIf

  ProcedureReturn result
EndProcedure

d.d = 20.000025

Debug StrExp(d)
Bei konstruktiven Verbesserungsvorschläge bin ich ganz Ohr :)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Kleiner Wettbewerb: Wer hat die beste Idee, wie man da besser
mit der Fließkommaungenauigkeit umgehen kann?

Beispiel: 27.0 wird zu 2.7000000000000002E+1 :freak:

Ich könnte ja einfach schreiben:

Code: Alles auswählen

result + StrD(d, 15)
Aber ich bin mir da nicht so sicher ob ich das so machen soll.
Erstens weiß ich nicht, ob ich damit wirklich alles Erschlage und
zweitens kommt es mir ein wenig vor wie geschummelt. Zudem
verliere ich eine Stelle, auch in den Fällen in denen das evtl.
Absicht ist.
0.9999999999999999 würde dann plötzlich zu 1.0. Ein
verschmerzbarer Verlust, aber nichtsdestotrotz ein Verlust :|
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten