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:

Rundungsfehler bei DOUBLE
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 22:51    Titel: Rundungsfehler bei DOUBLE Antworten mit Zitat

Hallo!

Kann mir jemand sagen wie ich auf das richtige Resultat (6) komme, ohne den Typ zu ändern?

DIM d AS DOUBLE
d=216
d=d^(1/3)

gibt 5.999... statt 6.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 26.05.2010, 22:54    Titel: Antworten mit Zitat

Seit wann ergibt (1/3) eine ganze Zahl.
Gruss


Zuletzt bearbeitet von funkeld am 26.05.2010, 23:02, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 22:56    Titel: Antworten mit Zitat

funkeld hat Folgendes geschrieben:
Seit wann ergibt (1/3) eine ganze Zahl???

Gruss


seit ewig.

6*6*6 = 216, also ist die 3. Wurzel daraus 6.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 26.05.2010, 22:56    Titel: Antworten mit Zitat

ha...ha..., du bist kein "Pisa-Schüler" ??? lächeln

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 23:00    Titel: Antworten mit Zitat

Lol, ich nix Schüler, versteh den Witz grad nicht. Weisst du wie ich das richtige Resultat bekomme?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 26.05.2010, 23:04    Titel: Antworten mit Zitat

Code:

DIM d AS DOUBLE
d=216
d=d^(1/3)
PRINT CINT(d)
Sleep


Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 23:05    Titel: Antworten mit Zitat

Ah, super, Danke!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.05.2010, 23:07    Titel: Antworten mit Zitat

Hallo,

das richtige Resultat erhältst du zum Beispiel so:
Code:
DIM d AS DOUBLE
d=216
d=d^(1/3)
PRINT USING "##.###"; d
SLEEP

Bei Gleitkommazahlen, zu denen auch Werte vom Datentyp DOUBLE gehören, treten Genauigkeitsprobleme auf, die dreael in seinem Artikel zum Thema beschreibt. Das ist allerdings kein FreeBASIC-spezifisches Problem, sondern auf das den Gleitkommazahlen zugrunde liegende Konzept zurückzuführen.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 23:16    Titel: B Antworten mit Zitat

Ah, sehr gut, Danke, werd ich gleich mal durchlesen.

Ich will eigentlich prüfen, ob das Resultat eine Natürliche Zahl ist. Das geht mit CINT und PRINT USING glaubs nicht. Kann ich das irgendwie anders lösen?

EDIT: Hab mein Beispiel soeben in GWBASIC versucht zu machen und weil es dort kein DOUBLE gibt SINGLE genommen. Mit diesem Typ geht's, auch in FB. Allerdings ist SINGLE zu klein.
Gibt es in FB Bibliotheken mit anderen Zahlen-Datentypen? Ich hab nur eine für hyperkomplexe Zahlen gefunden - zu viel des Guten.

EDIT 2: Ups, in GWBASIC gibt's natürlich auch DOUBLE. Damit gibt's ein von QB und FB verschiedenes Resultat.


Zuletzt bearbeitet von fuckroot am 27.05.2010, 01:10, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 26.05.2010, 23:41    Titel: Antworten mit Zitat

du kannst zum beispiel prüfen, ob das was hinterm komma steht absolut kleiner als 0.000000001 ist, und das dann einfach davon ausgehen dasses ne natürliche zahl ist und nur ein rundungsfehler vorliegt.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 26.05.2010, 23:46    Titel: Antworten mit Zitat

Hm, ja, stimmt, das sollte gehen. Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.05.2010, 23:48    Titel: Antworten mit Zitat

fuckroot hat Folgendes geschrieben:
funkeld hat Folgendes geschrieben:
Seit wann ergibt (1/3) eine ganze Zahl???

Gruss


seit ewig.

6*6*6 = 216, also ist die 3. Wurzel daraus 6.

1/3 kannst du aber nicht als kommazahl darstellen, und freebasic kann nicht mit brüchen umgehen. da steckt schon was dahinter. ein computer kann halt nicht beliebig genau arbeiten bei kommazahlen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 27.05.2010, 00:17    Titel: Antworten mit Zitat

Hm, es scheint mir doch Freebasic spezifisch zu sein - QBASIC 4.5 gibt zumindest das richtige Result.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.05.2010, 00:33    Titel: Antworten mit Zitat

Eigentlich sollte, sofern das gleiche Rundungsverfahren verwendet wird, unter QB genau das gleiche rauskommen. Das Rundungsverfahrung kann theoretisch über ASM-Befehle festgelegt werden, aber ich glaube FB hat da auch einen Kommandozeilen-Switch, wie präzise die Gleitkommaoperationen sein sollen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 27.05.2010, 00:38    Titel: Antworten mit Zitat

Aber mit SINGLE geht es in FB ja - Wieso sollte SINGLE präziser als DOUBLE sein?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.05.2010, 01:08    Titel: Antworten mit Zitat

Es sieht für dich präsizer aus, aber es ist weiter weg vom erreichneten (falschen) Ergebnis. Wenn es dir auf genaue Ergebnisse ankommt, ist Gleitkomma absolut fehlt am Platz!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 27.05.2010, 01:16    Titel: Antworten mit Zitat

Ersten Satz versteh ich nicht. Ja, du hast recht was Gleitkomma betrifft, aber in diesem Fall sollte schon das richtige Ergebnis ausgegeben werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.05.2010, 12:26    Titel: Antworten mit Zitat

Ich weiß ja auch nicht 100%ig genau, was da im inneren abläuft, aber es kann gut sein, dass intern 5.999... rauskommt, und das bei SINGLE (wegen kleinerem Datentypbereich) aufgerundet wird, also zu 6.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.05.2010, 12:53    Titel: Antworten mit Zitat

Richtig.

Beispiel: Als Ergebnis kommt 5.9999999999 raus, als double, was bis zu 10 kommastellen speichert (natürlich nicht ganz genau so in echt, aber das prinzip ist das selbe).

Jetzt kannst du dir entweder:
die double-zahl ausgeben lassen, also 5.9999999999

oder:
du speicherst die zahl vorher in einer single-variable.
Die Single-Variable kann sich nur halb so viele kommastellen merken. Beim speichern in der single-variable werden also die letzten 5 kommastellen abgeschnitten: 5.99999|schnipp|99999. Offensichtlich wird das dann aufgerundet damit weniger fehler entsteht, also kommt als ergebnis 6.00000 raus.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fuckroot



Anmeldungsdatum: 26.05.2010
Beiträge: 10

BeitragVerfasst am: 27.05.2010, 13:13    Titel: Antworten mit Zitat

Ah, ja, das macht Sinn. Aber wieso spuckt QB45 auch bei DOUBLE das richtige Resultat raus?
(Interessant ist das GWBASIC-Ergebnis: 5.999999523162842. Die "SINGLE-Stellen" sind alle 9, der Rest scheint zufällig.)

Hab grad komisches Rundungsverhalten in FB, QB und GW entdeckt:

e! = 5.9999992
print e! ----> 5.999999

e! = 5.9999993
print e! -----> 6

Weiss jemand was da passiert?
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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 FreeBASIC. 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