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:

Rechnen mit doppeltgenauen Fließkommazahlen

 
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
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

BeitragVerfasst am: 01.04.2005, 15:59    Titel: Rechnen mit doppeltgenauen Fließkommazahlen Antworten mit Zitat

Gibt es in Free-Basic keine doppeltgenauen Fließkommazahlen?
Wenn ich mit DIM X as Double ein Variable deklariere, habe ich nur
6 Stellen Genauigkeit.
Für betriebswirtschaftliche Anwendungen muß ich aber Beträge in
Millionenhöhe auf den Cent genau berechnen können.
Ist mit einer Verbesserung der Rechengenauigkeit für die kommenden Versionen vom Freebasic zu rechnen?

Mfg
Charly
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 01.04.2005, 16:40    Titel: Antworten mit Zitat

Hallo!

Beträge in Milltionenhöhe??!?
Dann hilft vielleicht, dass du ein paar Nuller wegtust zwinkern

X# = 100.333123

100.333123 ...ist in Wirklichkeit 100333123 €

Vielleicht hilft das?
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 01.04.2005, 17:56    Titel: Antworten mit Zitat

Und du bist sicher, dass du nicht Ausgabeformatierung mit interner Darstellung verwechselst?

Also intern wird zwar mit 15 Stellen gerechnet, ausgegeben werden aber weniger.
_________________
Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



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

BeitragVerfasst am: 01.04.2005, 17:59    Titel: Antworten mit Zitat

in freeBASIC (wie auch in QB und VB) sind DOUBLE-Zahlen 64bit-Zahlen. Normalerweise haben die 15 Nachkommastellen und einen Zahlenbereich von -10^308 bis 10^308.
Single haben 32bit, bis zu 7 Nachkommastellen, und reichen etwa von -10^38 bis 10^38.

In welcher Situation sind denn die Zahlen so ungenau geworden?
Es wird das beste sein, du postest einfach mal ein bisschen Code.


Noch ein Tipp: Musst du von Zeit zu Zeit mit INTEGERs multiplizieren?
Dadurch kann der Typ geändert werden.

DIM a AS SINGLE
a = 1.5
PRINT 1% * a
PRINT 1! * a

Wird unterschiedliche Ergebnisse bringen; zuerst 1, und dann 1.5.
Hats geholfen?

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
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

BeitragVerfasst am: 01.04.2005, 18:31    Titel: Antworten mit Zitat

Schön wärs ja, wenn es sich tatsächlich um 64bit Zahlen handelt.
Aber das bezweifle ich nach meinen Versuchen.
Nachfolgend ein kleines Testprogramm:

dim x as double,y as double, z as double
X = 723421.77
y = 488425.18
z = x + y
print z
print using "#######.##";z

Die Anzeige bei print z mit und ohne Using sieht wie folgt aus:
1.21185e+006

Herauskommen muß 1211846.95
Es wird also schon bei der 6. Stelle gerundet.
Bei Qbasic gibt es da keine Probleme.
Oder kommt hier jemand zu einem anderen Ergebnis?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



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

BeitragVerfasst am: 01.04.2005, 18:45    Titel: Antworten mit Zitat

Bei mir läufts perfekt.
Das Es wird zweimal dieselbe Zahl angezeigt. Sonst würde ich ja auf nen Fehler von USING tippen, aber das wars auch ned.
Auch die Groß/Kleinschreibung (von X) macht keine Probleme. Naja FB is sowiso ned Großschreibungssensetiv...


Welche Version von FB hast du?
es ist zwar unwahrscheinlich, aber vllt ist es ein alter Fehler. Probier mal die V0.12b aus. (Windows-Download-Link
Linux-Download-Link)
_________________
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
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

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

Bei mir läuft es jetzt auch!
Ich hatte die Version 0.10. Nach dem Download der neuesten
Version hat sich zunächst nichts geändert, wenn ich den Compiler
über die IDE gestartet habe.
Nach dem Direktstart des Compilers aus der Eingabeaufforderung
funktiionierte es dann plötzlich.
Es wird nun die Zahl mit der vollen Genauigkeit beim Print angezeigt.

Vielen Dank für den Hinweis!

Mfg
Charly
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jsammle



Anmeldungsdatum: 02.05.2014
Beiträge: 2

BeitragVerfasst am: 02.05.2014, 13:03    Titel: Antworten mit Zitat

Gestattet, dass ich mich hier anhänge!

Wie bei anderen Programmierdialekten fällt mir auch bei FREEBASIC auf, dass bei der COS-Funktion bei Argumenten nahe 90° DEG mit doppelt genauen Fließkommazahlen nicht exakt gerechnet wird, sondern nur bis zur ca. 8ten Nachkommastelle.

Beispiel:
dim x as double
x=89.999999*3.141592653589793238/180
print cos (x)
Ergebnis ist 1.745 329 242 813 939e-008
sollte sein 1.745 329 251 994 329e-008

Mit der entsprechenden SIN-Funktion
dim x as double
x=0.000001*3.141592653589793238/180
print sin (x)
ist das Ergebnis mit 1.745 329 251 994 33e-008 korrekt.

Ist das der Prozessor, von dem Fehler übernommen wird - falsch bzw. schlecht implementiert? Oder woher werden die mathematischen Funktionen sonst genommen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 02.05.2014, 13:41    Titel: Antworten mit Zitat

Ich dachte, wir hätten im Portal einen Eintrag bzgl. Genauigkeit von Nachkommastellen, aber ich finde jetzt dort auf die Schnelle nichts.

Tatsache ist, dass das Rechnen mit Gleitkommazahlen eben einfach nicht exakt ist, sondern immer eine Ungenauigkeit beinhaltet (solange nicht ausschließlich in Zweierpotenzen gerechnet wird). In deinem Beispiel ist bereits die Zahl PI (notgedrungen) ungenau - PI ist eben nicht exakt 3.141592653589793238, sondern nur ungefähr. Damit ist auch, im Bogenmaß gerechnet, der Kosinus von 3.141592653589793238 logischerweise nicht 0. Taschenrechner arbeiten da ein wenig anders als Computer, möglicherweise mit Feststellenarithmetik, genau weiß ich das nicht. Es ist auch möglich, das hier PI intern als exakter Wert verwendet wird. Interessant wäre daher, wie du den von dir genannten "exakten" Wert ermittelst.

Wenn ich in meinem betriebssystemeigenen Rechner cos(89.999999*3.141592653589793238/180) eintippe, erhalte ich übrigens bei 64bit Genauigkeit ungefähr den Wert 1,745 329 252 017 461 657 22e-008. grinsen Kurz und gut, je nachdem in welcher Reihenfolge und mit welchen Methoden gerechnet wird, kann in so engen Zahlenbereichen das Ergebnis gar nicht exakt sein - das gibt die Maschine gar nicht her.

Übrigens: Die von dir angegebenen Ergebnisse stimmen in 16 (!) Nachkommastellen überein. Die 1 zu Beginn ist bereits die 8. Nachkommastelle!



Edit: die mit meinem Betriebssystem-Taschenrechner ermittelte Näherung deckt sich übrigens mit der des sehr exakten Arithmetik-Interpreters ARIBAS bei 192bit Genauigkeit:
Code:
1.745 329 252 017 461 657 221 026 237 223 494 084 068 259 066 442 260 543 9e-8

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jsammle



Anmeldungsdatum: 02.05.2014
Beiträge: 2

BeitragVerfasst am: 02.05.2014, 18:49    Titel: Antworten mit Zitat

Calc.exe von Windows 7 pro 64 (offensichtlich eine korrekte Softwarelösung; Umkehrfunktionen probieren; Rundungsfehler bei ca. e-36 - e-46);
UBASIC von Prof. Yuji Kida (Mathematiker), geht bis ca. 5000 Stellen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 02.05.2014, 19:06    Titel: Antworten mit Zitat

jsammle hat Folgendes geschrieben:
UBASIC von Prof. Yuji Kida (Mathematiker), geht bis ca. 5000 Stellen.

Das ist mit IEEE-Floatingpoint einfach nicht möglich. 16 Nachkommastellen sind bei Double schon das Höchste der Gefühle. Wenn du mehr Präzision brauchst, musst du eine Bibliothek verwenden, die sowas in Software (z.B. mit Fixpunktarithmetik) berechnet. Die gängige Hardware (und FreeBASIC) hat dafür keine Implementierung.
_________________
» 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
dreael
Administrator


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

BeitragVerfasst am: 02.05.2014, 20:03    Titel: Antworten mit Zitat

Selber mit einem kleinen Code gespielt:
Code:
Dim a1 As Double, b1 As Single, c1 As Double
Dim a2 As Double, b2 As Single, c2 As Double

ScreenRes 640, 480, 4
Width 80, 30

a1 = 1.0 / 3.0
a2 = 0.1
Print Using "Zu Beginn: #.#################"; a1
Print Using "Zu Beginn: #.#################"; a2
b1 = a1
b2 = a2
Print "Einfach genau umgewandelt: "; b1
Print "Einfach genau umgewandelt: "; b2
c1 = b1
c2 = b2
Print "Wieder doppeltgenau: "; c1
Print "Wieder doppeltgenau: "; c2

Sleep


Quintessenz: Zahlenliterale mit Dezimalpunkt sind also per Default immer Double, erst bei einer Umwandlung in Single und zurück geht Genauigkeit verloren.

Früher in QB steuerte man den Typ eines Literals üblicherweise mit dem Datentyp-Zeichen:
Code:
' Falsch
a# = 0.1   ' wird als 0.1! compiliert

' Richtig
a# = 0.1#

' Verursacht Typumwandlung
b! = 2
' Kein Typumwandlung zur Laufzeit
b! = 2!

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 04.05.2014, 05:40    Titel: Antworten mit Zitat

Hallo!

@Charly2: Rechne doch mit Integer - bzw LongInt - Zahlen und Centbeträgen (bzw. bei Bedarf mit 1/10 oder 1/100 Cents). Dann hast du (zumindest beim Addieren und Subtrahieren) überhaupt keine Rundungsfehler.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 08.05.2014, 14:55    Titel: Antworten mit Zitat

Öh es geht hier doch um Geld? Und mit Geld spielt man nicht, deswegen nimmt man keine Floats, sondern Festkommaarithmetik.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 08.05.2014, 16:26    Titel: Antworten mit Zitat

28398 hat Folgendes geschrieben:
Und mit Geld spielt man nicht, deswegen nimmt man keine Floats, sondern Festkommaarithmetik.

Als Tipp sonst: Am besten eine Klasse für den Umgang mit Währungen schreiben, dabei nebst allen wichtigen Methoden auch die wichtigsten Operatoren passend überladen.

Als Anregung: Am besten einen Enum mit den verschiedenen Währungen definieren, die Klasse selber besitzt dann als private Attribute im Minimum den Betrag (Festkomma mit Longint wie hier diskutiert) + die Währung.

Dabei bei der Programmierung auch daran denken, z.B. beim Überladen von "+" die Währungen vergleichen => wenn diese verschieden sind, muss ein Fehler geworfen werden (in FB aktuell nur mit "Error" möglich). => Als Ergänzung noch an eine "Wechselstube"-Klasse denken, welche z.B. EUR in CHF umrechnet und umgekehrt.

Somit:

Code:
a = New Waehrung(14.0, Waehrung.CHF)
b = New Waehrung(17.0, Waehrung.EUR)

Print a.toString()   ' sollte sFr. 14.00 ausgeben
Print b.toString()   ' sollte € 17,00 ausgeben

c = a + b   ' soll ERROR 5 o.ä. werfen

c = Wechselstube.convert(a, Waehrung.EUR) + b
' dies soll ohne Fehler ausgeführt werden, weil die Franken
' in Euro gewechselt wurden, bevor beides zusammengezählt wird


Hier können sich also die Fans von Objektorientierung so richtig einmal austoben. :-)

Aus der Java-Welt:

http://docs.oracle.com/javase/7/docs/api/java/util/Currency.html

=> als Anregung, wie die passenden Programmierinterfaces aussehen könnten (es gab dort sogar kürzlich einen JSR zu genau diesem Thema).
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 11.05.2014, 12:59    Titel: Antworten mit Zitat

28398 hat Folgendes geschrieben:
Öh es geht hier doch um Geld? Und mit Geld spielt man nicht, deswegen nimmt man keine Floats, sondern Festkommaarithmetik.


Genau das. rechne mit integers, die dann "Millionstelcents" bedeuten. am besten mit 128bit breiten viechern, falls fb das kann
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


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

BeitragVerfasst am: 11.05.2014, 19:41    Titel: Antworten mit Zitat

Für die Interessierten: Bei Java läuft die ganze Thematik über JSR 354.

Wer einen Blick dort hineinwirft, wird feststellen, dass das Ganze eine recht komplexe API mit zig Klassen geworden ist. Unter

http://javaremarkables.blogspot.ch/2013/04/usage-examples-for-jsr-354.html

hat ein Blogger auch Beispielcode gepostet, so dass im Prinzip eine kleine Untermenge (Reduktion auf das Wesentliche) dieser API auch in FB implementiert werden könnte.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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
Seite 1 von 1

 
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