Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

AndreasHerrmann: Hilfe!! Kovertierung von IEEE in DEZ
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 26.04.2005, 15:18    Titel: AndreasHerrmann: Hilfe!! Kovertierung von IEEE in DEZ Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Marky



Anmeldungsdatum: 02.09.2004
Beiträge: 1173

BeitragVerfasst am: 26.04.2005, 15:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 26.04.2005, 15:54    Titel: Andreas Herrmann: Antworten mit Zitat

Sorry traurig

MFG

Andreas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 26.04.2005, 16:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 26.04.2005, 16:29    Titel: Antworten mit Zitat

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 zwinkern ) 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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 26.04.2005, 16:37    Titel: Antworten mit Zitat

Siehe umfangreicher Artikel zur im Titel genannten Problematik:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Gleitkommazahlen.html

Dort wird auch der interne Aufbau ausführlich diskutiert.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 26.04.2005, 16:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 26.04.2005, 17:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 26.04.2005, 19:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 26.04.2005, 19:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 26.04.2005, 19:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 26.04.2005, 21:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 26.04.2005, 22:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 27.04.2005, 09:19    Titel: AndreasHerrmann: Binärwert EIngabe Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bender



Anmeldungsdatum: 30.12.2004
Beiträge: 18

BeitragVerfasst am: 27.04.2005, 11:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 27.04.2005, 11:36    Titel: Antworten mit Zitat

Im 10ten . Wieso?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 27.04.2005, 22:28    Titel: Gleitkommazahlen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 28.04.2005, 09:03    Titel: ANdreas Herrmann: Funktioniert? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 28.04.2005, 10:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
anherrmann



Anmeldungsdatum: 26.04.2005
Beiträge: 11

BeitragVerfasst am: 28.04.2005, 10:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz