Nachkommastellen und überflüssige Nullen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Beitrag von Lupo »

Juhu ein Wettbewerb! :D

Code: Alles auswählen

Dim zahl.f(6)
zahl(1) = 100.1234
zahl(2) = 100.1230
zahl(3) = 100.1200
zahl(4) = 100.1000
zahl(5) = 100.0000
zahl(6) = 100
stellen = 4

For i = 1 To 6
Debug ReplaceString(ReplaceString(RTrim(ReplaceString(StrF(zahl(i), stellen), "0", " ", stellen)), " ", "0", stellen) , ".", "", 0, Len(ReplaceString(RTrim(ReplaceString(StrF(zahl(i), stellen), "0", " ", stellen)), " ", "0", stellen)))
Next
Ganz ohne Punkt hinten :mrgreen: :mrgreen:

Danke

LUPO
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

ts-soft hat geschrieben:@DD
Verstehe ich nicht, was Du meinst, nach Deiner Formel kommt: 113.4505

statt 13.4505
Boh mann ich hab auch noch besseres zu tun(das bissel kann man auch selber verstehen und fixen):

Code: Alles auswählen

Procedure.s StrF_Ex(Float.f, NbDecimals)
  Result1.s = StrF(Float, NbDecimals)
  Result2.s = ""
  For k=Len(Result1) To 1 Step -1
    Char.s = Mid(Result1, k, 1)
    If Char <> "0" And c = 0
      Result2 = Char+Result2
      c = 1
    ElseIf c = 1
      Result2 = Char+Result2
    EndIf
  Next
 
  ProcedureReturn Result2
EndProcedure

Debug StrF_Ex(13.4504889, 4)
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Juhu ein Wettbewerb! :D
Sowas in der Art in einem Contest (natürlich mehrere Aufgaben),
dann würde ich mich beteiligen.

>> Boh mann ich hab auch noch besseres zu tun(das bissel kann man auch selber verstehen und fixen):
Vielleicht haben andere auch besseres zu tun, als Deine fehlerhaften Proceduren zu fixen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Folgender Code sollte die überflüssigen Nullen in Nachkommastellen abschneiden, aber das scheitert an Rechenungenauigkeiten. Im Fall vom Ausgangswert 1.7000 zeigt Debug(y.f) tatsächlich exakt Null an, aber TROTZDEM bleibt der Wert x Null!!! Das kann demnach nur daran liegen, daß jenseits der sechsten Nachkommastelle im Debugger auch noch Zahlen existieren, sodaß der Debugger nur scheinbar für den Wert x exakt Null anzeigt.

Code: Alles auswählen

OpenWindow(0,0,0,606,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_minimizeGadget|#PB_Window_maximizeGadget,"") 
CreateGadgetList(WindowID(0))

TextGadget(1,200,100,100,20,"",#PB_text_border)

h.f = 1.700

Repeat
  y.f = (h.f  - Int(h.f))
  If y.f = 0
    x = 0
    Goto A
  EndIf

  y.f = (h.f * 10  - Int(h.f * 10))  
  Debug(y.f)  
  If y.f = 0
    x = 1
    Goto A
  EndIf

  y.f = (h.f * 100  - Int(h.f * 100))
  If y.f = 0
    x = 2
    Goto A
  EndIf

  y.f = (h.f * 1000  - Int(h.f * 1000))
  If y.f = 0
    x = 3
    Goto A
  EndIf

  y.f = (h.f * 10000  - Int(h.f * 10000))
  If y.f = 0
    x = 4
    Goto A
  EndIf

  A:
  SetGadgetText(1,StrF(h.f,x))

  EventID = WaitWindowEvent()
Until EventID = #PB_EventCloseWindow
PB42
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Wenn du deinen Code jetzt noch gescheit einrückst schau ich es mir vielleicht sogar mal an ;) :)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

ts-soft hat geschrieben:>> Boh mann ich hab auch noch besseres zu tun(das bissel kann man auch selber verstehen und fixen):
Vielleicht haben andere auch besseres zu tun, als Deine fehlerhaften Proceduren zu fixen :wink:
Ich wollt ja nur nen Ansatz geben und den hab ich in ner Minute mal schnell zusammengebastelt. Du musst wissen gestern wurde meine Seite(zumindest das phpBB) gehackt und ich bin am updaten von allem usw.. Außerdem musste ich noch für die Schule lernen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@DD
War ja auch nicht böse gemeint :wink: , geht mir ja auch oft so. Ich Schreibe dann aber meist bei: Ungetestet oder so!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

@ freedimension: Hi! Den kurzen Code würde ich selber nie einrücken, aber ich hab mir solche Mühe gemacht, den einzurücken :D Nun gut: Der Code, den ich da oben eingestellt habe, ist ein erschreckendes Beispiel dafür, wie schlecht man mit Floatzahlen arbeiten kann. Warum können das denn 20 Jahre alte Taschenrechner wesentlich besser?

PB42
Zuletzt geändert von PB42 am 08.11.2005 01:03, insgesamt 2-mal geändert.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

PB42 hat geschrieben:@ freedimension: Hi! Den kurzen Code würde ich selber nie einrücken, aber ich hab mir solche Mühe gemacht, den einzurücken
Vergiss es, ich habe mich des Elends schon selbst angenommen :freak:
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

floats SIND nunmal ungenau, und taschenrechner können sowas nur besser, wenn sie mehr bits für ihre berechnugen benutzen...

aber wie schon vorgeschlagen, warum parst du nicht einfach das ergebnis von StrF() von hinten nach nullern?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten