 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 26.04.2005, 15:18 Titel: AndreasHerrmann: Hilfe!! Kovertierung von IEEE in DEZ |
|
|
Hallo,
Ich bin Student der Elektrotechnik und benötige dringend Hilfe zu
einem Programm in QBasic geschrieben, das ich bis spätestens dieser
Woche fertig haben muss. Ich schicke euch einmal den Code mit, den
ich schon am Wochenende programmiert habe.
Leider macht das Programm als Ausgabe nicht das was esoll.
Das Programm soll ein IEEE-Format aus Binär Werten in der Form
0100, 0100, 1100,0000 (Eingabe) z.B den Dez Zahlenwert (Ausgabe)
errechnen. Doch leider berechnet er kommische Werte in mit 10^-37 und
bei jeder Ausgabe macht er immer dasselbe. Wieso?
Könnt er mir vielleicht ´hierzu bitte helfen den Fehler zu beheben,
so dass es richtig wichtig ist. dieses Tool brauche ich zu einer
weiteren Auslesung. Leider bin eben nicht so erfahren in QBasic.
ALso für eure Bemühungen bedanke ich mich schon einmal im voruas.
MFG
Andreas Herrmann
Code: | DIM a%(50)
COLOR 15, 1: CLS
LOCATE 3, 5: PRINT "Beenden durch ESC"
LOCATE 5, 5: PRINT "Input mehrfache IEEE Zahl, getrennt durch Komma:"
d% = 0
i$ = ""
DO
LOCATE 7, 5, 1: PRINT i$; SPACE$(80 - POS(x)); : LOCATE , 5 + d%
DO: k$ = INKEY$: LOOP WHILE k$ = ""
SELECT CASE k$
CASE CHR$(27): EXIT DO
CASE "0" TO "9", ",": GOSUB prt
CASE CHR$(8): GOSUB dlr
CASE CHR$(13): GOSUB calc
END SELECT
LOOP
END
calc: i$ = i$ + ","
FOR i% = 1 TO LEN(i$)
m$ = MID$(i$, i%, 1)
IF m$ = "," THEN
a%(n%) = VAL(n$): n$ = "": n% = n% + 1
ELSE
n$ = n$ + m$
END IF: NEXT
FOR i% = 0 TO 3
IF a%(i%) > 255 THEN
LOCATE 7, 5, 0:
PRINT "Error! Eine eingegebene Zahl ist gr"áer als 255"; : SLEEP
i$ = "": ERASE a%
END IF: NEXT
f$ = "": FOR i% = 3 TO 0 STEP -1: f$ = f$ + CHR$(a%(i%)): NEXT
e = CVS(f$)
LOCATE 14, 5: PRINT "Ergebnis als Dezimalzahl:":
LOCATE 16, 5: PRINT e:
i$ = "": d% = 0: RETURN
prt: IF d% > 74 THEN RETURN
LOCATE 16, 5: PRINT SPACE$(74);
i$ = i$ + k$: d% = d% + 1: k$ = "": RETURN
dlr: IF i$ = "" THEN RETURN
i$ = LEFT$(i$, LEN(i$) - 1): d% = d% - 1: RETURN |
|
|
Nach oben |
|
 |
Marky

Anmeldungsdatum: 02.09.2004 Beiträge: 1173
|
Verfasst am: 26.04.2005, 15:30 Titel: |
|
|
Nur weil du die Nachricht in alle möglichen Foren postest, wird sie bestimmt nicht schneller beantwortet. Guck mal in die Netikette: http://forum.qbasic.at/viewtopic.php?t=302! |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 26.04.2005, 15:54 Titel: Andreas Herrmann: |
|
|
Sorry
MFG
Andreas |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 26.04.2005, 16:19 Titel: |
|
|
Ich hoffe Dir macht es nichts aus, wenn ich mal etwas übersicht in das Programm gebracht habe.
Code: | DIM a%(50)
COLOR 15, 1: CLS
LOCATE 3, 5: PRINT "Beenden durch ESC"
LOCATE 5, 5: PRINT "Input mehrfache IEEE Zahl, getrennt durch Komma:"
d% = 0
i$ = ""
DO
LOCATE 7, 5, 1: PRINT i$; SPACE$(80 - POS(x)); : LOCATE , 5 + d%
DO: k$ = INKEY$: LOOP WHILE k$ = ""
SELECT CASE k$
'----- ESC: Programm beenden -----
CASE CHR$(27):
END
'----- Zeichen hinzu fügen -----
CASE "0" TO "9", ","
IF d% <= 74 THEN
LOCATE 16, 5
PRINT SPACE$(74);
i$ = i$ + k$
d% = d% + 1
k$ = ""
END IF
'----- letztes Zeichen löschen -----
CASE CHR$(8 )
IF i$ <> "" THEN
i$ = LEFT$(i$, LEN(i$) - 1)
d% = d% - 1
END IF
'----- Enter: Berechnung -----
CASE CHR$(13)
i$ = i$ + ","
FOR i% = 1 TO LEN(i$) 'Die durch Kommas getrenten Zahlen in a%() ablegen
m$ = MID$(i$, i%, 1)
IF m$ = "," THEN
a%(n%) = VAL(n$)
n$ = ""
n% = n% + 1
ELSE
n$ = n$ + m$
END IF
NEXT
FOR i% = 0 TO 3 'Keine Zahl darf größer 255 sein
IF a%(i%) > 255 THEN
LOCATE 7, 5, 0
PRINT "Error! Eine eingegebene Zahl ist größr als 255";
SLEEP
i$ = ""
ERASE a%
END IF
NEXT
f$ = "" 'Berechung
FOR i% = 3 TO 0 STEP -1
f$ = f$ + CHR$(a%(i%))
NEXT i%
e = CVS(f$)
'Ausgabe Ergebnis
LOCATE 14, 5: PRINT "Ergebnis als Dezimalzahl:":
LOCATE 16, 5: PRINT e:
i$ = "": d% = 0
END SELECT
LOOP |
Mitlerweile habe durchblickt was das Programm macht. Jetzt müßte ich nurnoch wissen was es machen sollte. Hast Du ein Beispiel, was bei einer möglichen Eingabe für ein Ergebnis heraus kommen soll? |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 26.04.2005, 16:29 Titel: |
|
|
Auszug aus der FB-Hilfe, die hier wohl auch Gültig sein sollte:
FreeBASIC Referenz hat Folgendes geschrieben: |
CVS
Syntax: CVD(4-Byte-String)
Typ: Funktion
Konvertiert einen 4-Byte-String (ein String aus 4 Zeichen) in eine SINGLE-Zahl.
Siehe auch MKD$.
'-----------------------'
MKD$
Syntax: MKD$(numerischer Ausdruck AS SINGLE)
Typ: Funktion
Verwandelt eine SINGLE-Zahl in einen 4-Byte-STRING.
Wird oft benutzt mit FIELD.
Kleines Beispiel (Syntax):
Code: |
DIM n AS SINGLE
n = 1.2345
e$ = MKS$(n)
|
|
Die Befehle gibts natürlich auch für alle anderen Datentypen: Integer (CVI), Long (CVL), ...
Wenn du im Binary-Modus einen Wert in eine Datei schreibst, also z.B.
a! = 3.14
PUT #1, a!
Dann wird in die Datei eben nicht "3.14" geschrieben, sondern ein 4 Byte langer String. Und diese 4 Byte sind ein Abbild der SINGLE-Speicherstelle im RAM, an der eben 3.14 Steht.
GET #1, a!
liest das ganze wieder so ein, wie du's brauchst, nämlich als SINGLE-Variable mit dem Wert 3.14. Manchmal (hier zum Beispiel ) ist es aber trotzdem nötig, Binary-Strings in Zahlen zu konvertieren.
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 26.04.2005, 16:53 Titel: |
|
|
Erst mal danke für die Erklärung Duski_Joe, aber ich hatte die Frage nach dem CVS Befehl wieder zurück gezogen, weil ich dann doch selber dahinter gekommen war.
Zum Programm:
Also folgendes macht das Programm im Moment. Wenn man 4 Zahlen eingibt, z.B.:65,32,0,0
Was Binär dann so aussehen würde:
01000001 00100000 00000000 00000000
Dann wandelt das Programm, nach der IEEE-Norm für einfache Gleitkommazahlen, diese Bitfolge in eine Dezimalzahl um. In diesem Beispiel kommt zum Beispiel 10 heraus was richtig währe falls Du das vor gehabt haben solltest. |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 26.04.2005, 17:38 Titel: |
|
|
Hallo,
ALso ich glaube du hast es schon soweit verstanden.
Das Programm soll folgendes tun:
Ich besitze eine bestimmte Bitreihenfolge im IEEE-Format:
z.B 0101 1011 0000 0000
Diese soll im Programm eingegeben werden, also:
in der Form:
0101,1011,0000,0000
Dann wandelt das Programm, wie du schon richtig geschrieben hast,nach der IEEE-Norm für einfache Gleitkommazahlen, diese Bitfolge in eine Dezimalzahl um. In diesem Beispiel kommt zum Beispiel 10 heraus was richtig währe falls Du das vor gehabt haben solltest.
Doch bei mir kommt immer, wenn ich die obige Eingabe vollziehe, ein Wert von 3.38...+10^-37 raus.
Und bei dir funktioniert es, ohne Abänderung?
Wenn nicht, kannst du mir einmal den gesammten Code zusenden, bzw. hier herein stellen?
MFG
Andreas |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 26.04.2005, 19:03 Titel: |
|
|
Da stellen sich mir zwei Fragen:
1. Wenn nur Binäre Zahlen eingegeben werden sollen, warum hast Du dann auch zugelassen, daß die Ziffern 2 bis 9 eingegben werden können?
2. Warum sind deine Bitfolgen immer nur 16 Bit lang. Eine einfache Gleitkommazahlen besteht doch aus 32 Bit so viel ich weiß. In Qbasic gibt es jedenfalls keine Gleitkommazahl die nur 16 Bit hat. Oder nicht? |
|
Nach oben |
|
 |
Kai Bareis

Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 26.04.2005, 19:19 Titel: |
|
|
Iinteger Variablen sind 16Bit oder nicht? _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 26.04.2005, 19:26 Titel: |
|
|
DAs Problem ist folgendes:
ALs erstes wollte ich wie es in der Form ist, wie es jetzt ist. die Eingabe mit der Form der Dezmalwerteingabe programmieren.
Doch bei der Eingabe kommen Fehler auf. Wenn ich z.B dein Beispiel nehme und 65,.... eingebe erhalte ich eine Wert von 1,75..10^-30
Und das stimmt hinten und vorne nicht.
Daher wollte ich dich fragen:
Funktioniert das Programmbei dir, mit meinem ursprünglichen Code, da du offenar den richtigen Wert herausbekommst?
Wenn du ihrn verändert hast,
könntest du mir diesen danns senden, bzw. ins Netz stellen?
2. Da dies nicht mit dem DEZ Wert funktioniert hat, wollte ich die Eingabe in Binär, da ich von dem Protokoll Binärwerte erhalte. Dann könnte ich diese dirket eingeben.
Mitdem 16-bit und 32-bit schein wohl ei nFehler zu sein.
Könntest du diesen korrigieren,bitte, so dass es läuft?
MFG
Andreas Herrmann |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 26.04.2005, 21:06 Titel: |
|
|
Ich habe jetzt gerade noch mal Dein unverändertes orginal Programm verwendet und es kam wieder 10 raus wenn ich 65,32,0,0 eingebe.
Einen Fehler habe jetzt aber doch finden können:
...
calc: i$ = i$ + ","
n% = 0
FOR i% = 1 TO LEN(i$)
m$ = MID$(i$, i%, 1)
IF m$ = "," THEN
a%(n%) = VAL(n$): n$ = "": n% = n% + 1
ELSE
n$ = n$ + m$
END IF: NEXT
...
Ohne diese Zeile wird immer nur das Ergebnis der ersten Berechnung ausgegeben. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 26.04.2005, 22:53 Titel: |
|
|
Hallo
anherrmann hat Folgendes geschrieben: | Mitdem 16-bit und 32-bit schein wohl ei nFehler zu sein.
Könntest du diesen korrigieren,bitte, so dass es läuft? |
Also ob 16 oder 32 Bit ist doch elementar für dein ganzes Problem und du übergehst das so einfach mit "scheint wohl ein Fehler zu sein". Wie wäre es, wenn du dich erst mal selbst mit den Grundlagen beschäftigst? Wenn du Elektrotechnik studierst, solltest du sowas eigentlich selbst auf die Reihe bekommen. Wenn man sich mit Digitaltechnik beschäftigt, sollten Umwandlungen von einem Zahlensystem in ein anderes schon einigermassen sitzen. Was machst du z.B. in Messtechnik, wenn du den Fehler eines digitalen Messinstumentes in eine Fehlerrechnung mit einbeziehen sollst oder so?
http://de.wikipedia.org/wiki/Gleitkommazahl
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 27.04.2005, 09:19 Titel: AndreasHerrmann: Binärwert EIngabe |
|
|
Hallo,
wie kann ich jetzt aber in dem Programm nur die Eingabe von BinärZahlen ermöglichen?
ALso die EIngabe in form von: 00010000,00001111,00000000,000000000
Was muss ich hier in meinem Code umstellen bzw. verbessern?
MFG
Andreas |
|
Nach oben |
|
 |
Bender

Anmeldungsdatum: 30.12.2004 Beiträge: 18
|
Verfasst am: 27.04.2005, 11:05 Titel: |
|
|
Hallo... ich weiss, es hat nichts mit dem Thema zu tun, aber in welchem Semester bist du im Moment?
Gruß,
Bender
Zuletzt bearbeitet von Bender am 28.04.2005, 00:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 27.04.2005, 11:36 Titel: |
|
|
Im 10ten . Wieso? |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 27.04.2005, 22:28 Titel: Gleitkommazahlen |
|
|
Ja so was, da ist man mal einen Tag nicht da und schon geht hier nichts vorwärts. Zufälligerweise studiere ich auch Elektrotechnik und da mich gerade solche Sachen interessieren habe ich mal noch etwas am Programm herum gebastelt:
Code: | DIM a%(3)
COLOR 15, 1: CLS
LOCATE 3, 5: PRINT "Beenden durch ESC"
LOCATE 5, 5: PRINT "Input mehrfache IEEE Zahl, getrennt durch Komma:"
DO
'----- Ausgabe der eingabe -----
FOR i% = 0 TO 31
LOCATE 7 + i% \ 8, 5 + i% MOD 8, 0
IF i% >= LEN(i$) THEN
PRINT "_";
ELSE
PRINT MID$(i$, i% + 1, 1)
END IF
NEXT i%
DO: k$ = INKEY$: LOOP WHILE k$ = ""
SELECT CASE k$
'----- ESC: Programm beenden -----
CASE CHR$(27):
END
'----- Zeichen hinzu fügen -----
CASE "0", "1"
IF LEN(i$) < 32 THEN
LOCATE 16, 5
PRINT SPACE$(74);
i$ = i$ + k$
k$ = ""
END IF
'----- letztes Zeichen löschen -----
CASE CHR$(8)
IF i$ <> "" THEN i$ = LEFT$(i$, LEN(i$) - 1)
'----- Enter: Berechnung -----
CASE CHR$(13)
IF LEN(i$) = 32 THEN
ERASE a% 'Ablegen des Strings in a()
FOR i% = 0 TO 31
a%(i% \ 8) = a%(i% \ 8) * 2 + VAL(MID$(i$, i% + 1, 1))
NEXT i%
f$ = "" 'Berechung
FOR i% = 3 TO 0 STEP -1
f$ = f$ + CHR$(a%(i%))
NEXT i%
e = CVS(f$)
'Ausgabe Ergebnis
LOCATE 14, 5: PRINT "Ergebnis als Dezimalzahl:":
LOCATE 16, 5: PRINT e:
i$ = ""
SLEEP
END IF
END SELECT
LOOP |
Einfach in eine Textdatei speichern und die Dateiendung von .txt auf .bas ändern, dann mit qb öffnen und ausführen. Viel spaß. |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 28.04.2005, 09:03 Titel: ANdreas Herrmann: Funktioniert? |
|
|
Hallo,
ALso erst vorab danke für deine Bemühungen.
Ich habe das Programm heute morgen gestestet, aber als ich die Binärzahlkombination eingab bei der 50 als Dez.Zahl herauskomen sollte,
kam ein Wert von 9,2...+10^20 heraus.
Folgende Eingabe:
01100010
01001000
00000000
00000000
Funktioniert es bei dir uneingeschränkt, wenn du diese Werte eingibst?
Woran könnte dies liegen?
MFG
Andreas+Danke im voraus
p.S: Kann ich dich direkt auch anmailen?
Das andere Programm mit der Dez.Wert Eingabe funktioniert jetzt .Danke |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 28.04.2005, 10:19 Titel: |
|
|
Dann wollen wir mal Deine Zahl untersuchen:
01100010
01001000
00000000
00000000
Vorzeichen = 0bin -> Also ist die Zahl Positiv
Exponent = 11000100bin - 127 = 196-127 = 69
Mantisse = 10010000000000000000000bin / 2²³ + 1= 4718592 / 8388608 + 1 = 1,5625
Zahl = (Vorzeichen) Mantisse * 2^Exponent = +1,5625 * 2 ^ 69 = 9,2233720*10^20
Ich würde mal sagen das Programm funktioniert. |
|
Nach oben |
|
 |
anherrmann
Anmeldungsdatum: 26.04.2005 Beiträge: 11
|
Verfasst am: 28.04.2005, 10:28 Titel: |
|
|
Nee ich hatte gedacht, dass wenn man die Bitfolge man die konkrete DEZ Wert erhält, wie bei meinem anderen Programm.
wo ich eben die IEEE-format in DEZ eingab, also 66, 72, 0,0 und danch als Dez.Wert 50 erhielt. Und so möchte ich das hier auch gern, dass satt 66,72,0,0 einfach den direkten binärwert eingebe und daraufhin den Dez.Wert bezogen auf das Beispiel 50 erhalte.
Wie kann man das machen?
Das Problem ist ja, ich bekomme den direkten das IEEE-Format in Binärwerte und will sie nicht noch in DEZ erst umrechnen müssen.
Doch wie kann man dies tun?
MFG
Andreas |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|