Zahl aus String errechnen
Übersicht

![]() |
GarfieldBetreff: Zahl aus String errechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ! ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei BMax hat doch jeder String ne Mathode ToInt(), und die Rundet glaub ich besser, probiers dass doch mal. | ||
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group