Zahl aus String errechnen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Garfield

Betreff: Zahl aus String errechnen

BeitragDi, Dez 27, 2005 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
die Funktion Zahl_aus_String funktioniert eigentlich sehr gut.
Leider hat sie auf meinem VAIO Notebook unter BMAX ein Problem:

Ergebnis (BMAX):
1
22
333
4428
55555
666666
7777728
88888888

weil:

10^1 =10
10^2 =100
10^3 =999 <----
10^4 =10000
10^5 =100000
10^6 =999999 <----
10^7 =10000000
10^8 =100000000
10^9 =999999999 <----
10^10 =10000000000

das ist bitter!

hat jemand einen anderen kurzen Code der Zahlen aus einem String ausliest?
die INT() Funktion nützt leider nichts, weil ich die Funktion für Eingabeabfragen in TExtfields benutzen will und eine Längenbeschränkung und Buchstabenverbot erzwingen will.
Natürlich könnte man das über etliche If Then Abfragen lösen, aber ich wollte eigentlich nicht auf meine kleine "absolut geniale" Funktion verzichten, obwohl ich werds mal mit der INT() Funktion versuchen, das müsste eigentlich gehen...

Auf jeden Fall ist das ein BUG-ALERT für BMAX ! user posted image

Post im englischen Forum: http://www.blitzbasic.com/Comm...opic=54701

BPlus Code:
Code: [AUSKLAPPEN]

Dim Wert(10)

Print Zahl_aus_String("1")
Print Zahl_aus_String("22")
Print Zahl_aus_String("333")
Print Zahl_aus_String("4444")
Print Zahl_aus_String("55555")
Print Zahl_aus_String("666666")
Print Zahl_aus_String("7777777")
Print Zahl_aus_String("88888888")

WaitKey

Function Zahl_aus_String(xx$)

l = Len(xx$)
For z = 1 To l
   Wert(z) = Asc(Mid$(xx$,z,1))
   Wert(z) = Wert(z) - 48
Next
Dez = 10 ^ (l-1)
For z = 1 To l
   Zahl = Zahl + Wert(z)*Dez
   Dez = Dez/10
Next
Return Zahl
End Function


BMAX Code:
Code: [AUSKLAPPEN]

Global Wert:Int[10]

Print Zahl_aus_String("1")
Print Zahl_aus_String("22")
Print Zahl_aus_String("333")
Print Zahl_aus_String("4444")
Print Zahl_aus_String("55555")
Print Zahl_aus_String("666666")
Print Zahl_aus_String("7777777")
Print Zahl_aus_String("88888888")

WaitKey

Function Zahl_aus_String(xx$)

l = Len(xx$)
For z = 1 To l
   Wert[z] = Asc(Mid$(xx$,z,1))
   Wert[z] = Wert[z] - 48
Next
Dez = 10 ^ (l-1)
For z = 1 To l
   Zahl = Zahl + Wert[z]*Dez
   Dez = Dez/10
Next
Return Zahl
End Function
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra

Garfield

BeitragDi, Dez 27, 2005 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
OK ich hab mir selbst geantwortet:

da ich irrtümlicherweise der Ansicht war INT() nimmt immer nur die ersten 3 Werte habe ich die eigene Funktion genommen.
Das ganze ist eigentlich extrem simpel......

So überprüft die Funktion die Länge und verbietet Buchstaben.
Wenn der Thread zu doof ist, bitte löschen, aber der Bug in BMAX ist ja real

Code: [AUSKLAPPEN]

Function Stringinzahl:Int(str:String,wertvorher:Int)
   Local Zahl:Int
   Local Wert:Int
   str = Trim(str)
   Local l:Int = Len(str)
   If l > 5
      Notify "Zahl zu gross!!!!"
      Return wertvorher
   End If
   For Local z = 1 To l
      Wert = Asc(Mid$(str,z,1))
      If Wert < 48 Or Wert > 57
          Notify "keine Zahl"
         Return wertvorher
      End If
   Next
   Zahl = Int(str)
Return Zahl
End Function
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra
 

Dreamora

BeitragDi, Dez 27, 2005 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist kein Bug sondern ein Rundungsfehler aufgrund eingeschränkter Genauigkeit ... und das Problem mit Potenzen und dynamischen Werten ist schon seit BM 1.0 bekannt ...

Da BM aber auf Speed setzt und nicht wie Blitz3D das dann noch rummodifiziert vor der Ausgabe (und dadurch dann halt auch mehrfach langsamer ist), lässt sich daran wenig ändern ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BtbN

BeitragMi, Dez 28, 2005 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei BMax hat doch jeder String ne Mathode ToInt(), und die Rundet glaub ich besser, probiers dass doch mal.

Garfield

BeitragMi, Dez 28, 2005 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist ja nicht das Runden sondern das BMax auf meinem Laptop im Gegensatz zu meinem stationären Rechner die Potenzen (nicht alle) einfach falsch ausrechnet.

für meinen Sony VAIO ist 10^3 = 999

Das ist doch absolut inakzeptabel, für ein Programm, daß nun endlich auch doppelte Genauigkeit kennt!
Die Frage ist wo liegt genau der Hase im Pfeffer, der Compiler erzeugt auf meinem VAIO ja auch einen Code mit unterschiedlicher Größe zu meinem anderen PC. Sind da irgendwelche Borland Module anders installiert, oder ist es tatsächlich der Pentium Mobile, der ja mit Sicherheit eine andere Architektur als der P4 hat.

Code: [AUSKLAPPEN]

For x:Long = 1.0 To 10.0
Dez:Long = 10.0^x
Print Dez
Next

ergibt bei 10 Hoch 3 = 999
----------------------------------> zumindest auf meinem Vaio Crying or Very sad

Code: [AUSKLAPPEN]

Print 10*10*10

ergibt 1000

worin liegt da der Sinn?

erst:
Code: [AUSKLAPPEN]
For x = 1 To 10
Dez:Float = 10^x
Print Dez
Next


ergibt eine korrekte 1000.000

naja, Schwamm drüber, aber falls jemand Programme schreibt und nicht darauf achtet, daß diese Variablen auch Floats sein müssen, kann eine Diskalkulation in dieser Art ja schon erhebliche Fehlfunktionen bewirken.

Die Funktion INT() bewirkt das gleiche wie .toInt und ist genau das was ich in meiner Funktion im Type brauchte Smile
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra
 

Dreamora

BeitragMi, Dez 28, 2005 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe kein Problem.

Ich bekomme durchgehend 1000.000000007 mit dynamischen Werten und mit vordefinierten Werten sogar genau 1000.000000000000

Ich habe einen Pentium-M Banias (also erste Generation P-M, aktuell sind wir ja bei der 3. Generation)

Wenn du ein Vaio hast, hast du eventuell ein ULV Model oder hast du mittels Centrino Hardware Center / Notebook Hardware Center an deiner Spannung des Chips rumgedreht?
Mindestens letzteres würde die Fehler erklären.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Garfield

BeitragMi, Dez 28, 2005 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
nee nee, nix dergleichen.
Modell VGN-A115B

mal sehen ob sich im englischen Forum irgendwas tut, das mit den unterschiedlich groß kompilierten Datein scheint ja irgendwie ein Zeichen zu sein, das da was anders ist.

Aber: was hat die Spannung der Prozessoren mit der Rechengenauigkeit zu tun? Dann wären wir ja wieder im analogen Zeitalter....
Oder werden dann wegen Überhitzung Bits eingespart? Wink
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group