Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Ungenauikeit bei berechnung mit JavaScript

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> HTML/CSS/Javascript
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Gabelmann



Anmeldungsdatum: 25.07.2006
Beiträge: 1

BeitragVerfasst am: 25. Jul 2006 16:01    Titel: Ungenauikeit bei berechnung mit JavaScript Antworten mit Zitat

Hallo zusammen


Ich habe probiert einen Rechner mit JavaScript zu schreiben der mithilfe des Heron-Algorithmus Quadratwurzeln ausrechnet. Der Rechner fängt aber ab der ca. 17. Nachkommastelle ungenau zu werden bzw. hängt nurnoch "falsche" Endnullen an. Dies ändert sich auch nicht bei einer sehr hohen Anzahl von Durchläufen 10^7. Der bei jedem Durchlauf zu verwendende Wert wird jeweils in einem Array gespeichert. Wir vermuten das dort der Fehler steckt und eine nummerrische ungenauigkeit auftritt. Wir hoffen das euch diese Informationen reichen um uns eine Aussage über den Fehler zu geben.

Es wäre sehr nett wenn ihr euch einmal damit befassen könnt. Gott
Mit freundlichen Grüßen Gabelmann
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 25. Jul 2006 16:11    Titel: Antworten mit Zitat

Hallo!

Ja, bei JavaScript wird wohl intern ein 64-bit IEEE 754 Format verwendet. Damit kann man so 15 oder 16 signifikante Stellen darstellen, so weit ich gefunden habe.
Wenn die Geschwindigkeit egal ist, könntest Du mal suchen, ob Du JavaScript Bibliotheken finden kannst, die mit einer höheren Genauigkeit rechnen können. Ich konnte da aber auf die Schnelle nichts finden.

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Senior Sanchez



Anmeldungsdatum: 19.06.2006
Beiträge: 9

BeitragVerfasst am: 25. Jul 2006 23:35    Titel: Antworten mit Zitat

Wie genau braucht ihr es denn?

Es gäbe ne Variante, aber ich weiß nicht ob das mit javascript geht.

Verschiebt doch einfach die Kommastelle. Falls das ganze für den Datenbereich des verwendeten Typs zu groß wird, dann müsst ihr wohl oder übel ne BigNumber-Implementierung einbauen, sprich eine Funktion um große Zahlen darstellen zu können.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 26. Jul 2006 00:52    Titel: Antworten mit Zitat

Senior Sanchez hat Folgendes geschrieben:
Verschiebt doch einfach die Kommastelle.


Das wird wahrscheinlich nichts bringen, weil double-Zahlen das ja schon selber machen. Die signifikanten Stellen werden da ja nicht mehr.

Wie man auf der Basis der JavaScript Zahlen etwas mit höherer Genauigkeit implementiert, weiß ich allerdings auch nicht. Hab im Netz nix finden können...
Normalerweise macht man so was nicht mit JavaScript, deshalb gibt es da wohl auch keine Bibliotheken dafür. Selbst sowas zu schreiben ist nicht ganz einfach. In JavaScript wird es eher noch schwerer, weil alles auf einem double-Typ basieren muß und man nicht selbst festlegen kann, was integer ist und so weiter... Wenn man da nicht irgendwo eine fertige Bibliothek für findet, würde ich eher empfehlen das in Java zu machen und dann diese BigNumber-Klasse zu verwenden (das war doch Java, oder?).

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 26. Jul 2006 01:12    Titel: Antworten mit Zitat

Ich glaube, hier hab' ich doch was gefunden:
http://www.math.fau.edu/Richman/jscripts.htm
Dort kannst Du mal schauen, ob Dir das unter "10. Multiple precision arithmetic" vielleicht etwas bringt.
Allerdings geht's da nur um große Integerzahlen. Der Trick ist dann, dass man ein ganzes Array von JavaScript-Zahlen zusammen faßt. Allerdings muß man dann halt auch alle Rechenarten nachprogrammieren. Das ganze wird dann auch noch dadurch unlustig, weil die Objektorientiertheit in JavaScript ja nicht so besonders schön ist. Gibt es da überhaupt Operator-Überladung und so Zeug?
Wenn man aus den großen Integerzahlen Gleitkommazahlen mit großer Anzahl signifikanter Stellen machen will, dann müßte man noch eine extra Zahl als Exponent speichern. Dann braucht man wahrscheinlich auch noch Funktionen, die das ganze wieder in einen String umwandeln können, weil man es ja auch irgendwann auf dem Bildschirm ausgeben will.
Wollt Ihr Euch das wirklich alles antuen? Das wäre ja schon ein eigenes Projekt, eine solche Bibliothek zu machen. Und zwar kein kleines Projekt...

Gruß
Marco

//Edit: Du kannst dieses longint vielleicht wirklich verwenden, und zwar, wenn Du Zähler und Nenner getrennt berechnest in jedem Iterationsschritt. Du kannst ja die Rekursionsformel von Heron so umformen, dass Du jede Zahl als Bruchzahl mit Zähler und Nenner auffaßt. Dann kannst Du in jedem Rekursionsschritt zwei Formeln berechnen, eine für den Zähler und eine für den Nenner.
Zum Schluß hast Du dann das Ergebnis als einen großen Bruch. Wenn Du daraus eine Dezimalzahl machen willst, kannst Du vielleicht eine ganz normale Division für jede Stelle machen, wie man das auch in der Schule lernt. Dann halt nach ein paar Stellen abbrechen, sonst wird das bei einer Periode eine ziemlich lange Dezimalzahl, eben bis der Browser abstürzt...
Allerdings, wie gesagt: In JavaScript ist so was echt kein Spaß!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 26. Jul 2006 15:07    Titel: Antworten mit Zitat

Nicht mal Java kennt Operatorüberladungen, da würds mich wundern, wenn JS das hätte...
_________________
Genie oder Wahnsinn? Wer kann es wissen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Senior Sanchez



Anmeldungsdatum: 19.06.2006
Beiträge: 9

BeitragVerfasst am: 26. Jul 2006 16:18    Titel: Antworten mit Zitat

Genau die Variante von as_string meinte ich.

Ich hatte sowas mal implementiert und wenn man sich nen Kopf macht dann gehts auch. Problematisch sind nur Überträge zwischen den Elementen.

Die java-Klassen dazu sind BigDecimal und BigInteger.

Nur wäre jetzt die Frage, welche Operationen er alles braucht (auf googlen habe ich keine Lust ;-) )

PS: Mit der Zahl der signifikanten Stellen hatteste natürlich recht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 26. Jul 2006 21:24    Titel: Antworten mit Zitat

Senior Sanchez hat Folgendes geschrieben:
Nur wäre jetzt die Frage, welche Operationen er alles braucht (auf googlen habe ich keine Lust ;-) )


Das Heron-Verfahren ist eigentlich das Newton-Verfahren für eine Wurzel.
Man hat die Iteration:

Wobei a immer die Zahl ist, von der man die Wurzel ziehen will.
Also an sich nichts dramatisches. Meine Idee war jetzt, dass man mit x_0 = 1 anfangen könnte und das ganze wirklich mit richtigen Brüchen, also Zähler und Nenner rechnen könnte. Wenn a eine Bruchzahl ist, dann sollte das ja gehen, denke ich.
Man bekommt dann bei jedem Iterationsschritt Brüche mit immer größerem Zähler und Nenner raus. Bis dahin wäre es aber nur Multiplikation und Addition von ganzen Zahlen.
Am Ende müßte man dann den Bruch ausrechnen, wobei in der Beispielbibliothek, zu der ich verlinkt habe, auch eine Funktion dabei ist, die gleichzeitig eine Ganzzahldivision und eine Modulo-Operation macht. Man bekommt also in einem Schritt auch gleich noch den Rest der Division und könnte damit dann nach und nach die Nachkommastellen ausrechnen, denke ich ähnlich wie man das in der Schule auch von Hand gemacht hat.

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> HTML/CSS/Javascript 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.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen