Aktuelle Zeit: 16.08.2018 09:56

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 1e-15, 3e23 richtig ausgeben
BeitragVerfasst: 05.07.2018 13:13 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo

Wie werden die Float-Zahlen 1e-15 und 3e23 richtig ausgegeben?

Code:
;Zeige Zahlen aus dem float Wertebereich an.
Structure VierByte
  StructureUnion
    f.f
    l.l
  EndStructureUnion
EndStructure
Define f.VierByte\f=1e-15
Define g.VierByte\f=3e23
Debug f\f
Debug StrF(f\f)
Debug FormatNumber(f\f,61)
Debug FormatNumber(f\f,Int(Log10(1/f\f)+17))
Debug RSet(Bin(f\l),32,"0")
Debug g\f
Debug StrF(g\f)
Debug RSet(Bin(g\l),32,"0")
Debug FormatNumber(g\f,0)
Debug ""
MessageRequester("Warte","Warte")
Define i.i=1
f\f=1.0
g\f=1.0
While f\f>0.0
  Debug i
  Debug f\f
  Debug StrF(f\f)
  Debug FormatNumber(f\f,61)
  Debug FormatNumber(f\f,Int(Log10(1/f\f)+17))
  Debug RSet(Bin(f\l),32,"0")
  Debug g\f
  Debug StrF(g\f)
  Debug RSet(Bin(g\l),32,"0")
  Debug FormatNumber(g\f,0)
  Debug ""
  f\f=f\f/2.0
  g\f=g\f*2.0
  i=i+1
Wend

_________________
PB Spickzettel

Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im sichtbaren Universum.
Bitte Frage fragen.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 1e-15, 3e23 richtig ausgeben
BeitragVerfasst: 05.07.2018 17:01 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Im englischen Forum gibt es dazu einen ganzen Thread. Vielleicht ist das genau das, was du suchst: Printing floating point numbers with exponents

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Creality 3D CR-10 Review und erste Druckergebnisse
Ubuntu Gnome 16.04.3 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 1e-15, 3e23 richtig ausgeben
BeitragVerfasst: 28.07.2018 10:10 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Hat ein wenig gedauert :)
Code:
;-TOP
; Created by mk-soft, v1.01, 28.07.2018

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    ImportC ""
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
        __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "_snprintf"
      CompilerElse
        __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "__snprintf"
      CompilerEndIf 
    EndImport
  CompilerCase #PB_OS_MacOS
    ImportC ""
      __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "_snprintf"
    EndImport
  CompilerCase #PB_OS_Linux
    ImportC ""
      __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "snprintf"
    EndImport
CompilerEndSelect

Procedure.s StrE(dblVal.d, decimal = 18)
  Protected *pResult
  Protected sFMT.s
  Protected Result.s
 
  *pResult = AllocateMemory(256)
  sFMT = "%s%."+Str(decimal) + "e"
  If __StrE(*pResult, 255, sFMT, #Empty$, dblVal) > 0
    Result = PeekS(*pResult, -1, #PB_Ascii)
  EndIf
  FreeMemory(*pResult)
  ProcedureReturn Result
EndProcedure


f1.f = 12345.6789
d1.d = 1234567890123456789.0

Debug StrE(f1, 8)
Debug StrE(d1,18)

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 1e-15, 3e23 richtig ausgeben
BeitragVerfasst: 10.08.2018 06:46 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo mk-soft,
vielen Dank für __StrE Deklaration.
Code:
; Double und Float ggf. mit Exponent ausgeben.

CompilerSelect #PB_Compiler_OS ;Created by mk-soft, v1.01, 28.07.2018
  CompilerCase #PB_OS_Windows
    ImportC ""
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
        __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "_snprintf"
      CompilerElse
        __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "__snprintf"
      CompilerEndIf 
    EndImport
  CompilerCase #PB_OS_MacOS
    ImportC ""
      __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "_snprintf"
    EndImport
  CompilerCase #PB_OS_Linux
    ImportC ""
      __StrE(*pResult, nBytes, sFMT.p-ascii, sBugfix.s, dblVal.d) As "snprintf"
    EndImport
CompilerEndSelect

Procedure.s DebugStrF(fltVal.f)
  Protected pResult.s{128}
  Protected sFMT.s
  Protected Result.s
  If (fltVal<1e-10 And fltVal>-1e-10 And fltVal<>0.0) Or fltVal>=1e10 Or  fltVal<=-1e10   
    sFMT = "%s%.5e"
    If __StrE(@pResult, 255, sFMT, #Empty$, fltVal) > 0
      Result=PeekS(@pResult, -1, #PB_Ascii)
      ; lösche Nullen zwischen Komma und e
      While FindString(Result,"0e")
        Result=ReplaceString(Result,"0e","e")
      Wend
      If FindString(Result,".e")
        Result=ReplaceString(Result,".e","e")
      EndIf 
      ProcedureReturn Result
    Else
      ProcedureReturn ""
    EndIf 
  Else
    ProcedureReturn StrF(fltVal)
 EndIf
EndProcedure

Procedure.s DebugStrD(dblVal.d)
  Protected pResult.s{128}
  Protected sFMT.s
  Protected Result.s
  If (dblVal<1e-10 And dblVal>-1e-10 And dblVal<>0.0) Or dblVal>=1e10 Or  dblVal<=-1e10 
    sFMT = "%s%.14e"
    If __StrE(@pResult, 255, sFMT, #Empty$, dblVal) > 0
      Result=PeekS(@pResult, -1, #PB_Ascii)
      ; lösche Nullen zwischen Komma und e
      While FindString(Result,"0e")
        Result=ReplaceString(Result,"0e","e")
      Wend
      If FindString(Result,".e")
        Result=ReplaceString(Result,".e","e")
      EndIf 
      ProcedureReturn Result
    Else
      ProcedureReturn ""
    EndIf 
  Else
    ProcedureReturn StrD(dblVal)
 EndIf
EndProcedure

f1.f = 1e-15
d1.d = 3e23
Debug DebugStrF(f1)
Debug DebugStrD(d1)

f1=1.23e38
While f1>0.0
  Debug DebugStrF(f1)
  f1/10
Wend
f1=-1.711e38
While f1<0
  Debug DebugStrF(f1)
  f1/10
Wend
d1=1e100
While d1>0.0
  Debug DebugStrD(d1)
  d1/10
Wend
d1=-1.23456789012345678e38
While d1<0
  Debug DebugStrD(d1)
  d1/10
Wend

Wie können wir Fred überzeugen, das in seinen Debug einzubauen? Schluß mit Debugausgaben 0 für kleine Zahlen und Nullenzählen
bei großen Zahlen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], hjbremer und 5 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye