Seite 1 von 1

Stringausgabe in Exponentialschreibweise

Verfasst: 26.02.2006 18:38
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 :)

Verfasst: 27.02.2006 01:25
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 :|