FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Allgemeines

Fakultäten unter JavaScript

Fakultäten unter JavaScript 2008-06-26 19:14
Lars Knickrehm
Hallo,

ich bin ein Schüler aus Norddeutschland. Ich besuche die 11. Klasse des größten Schleswig-Holsteiner Gymnasiums "Theodor-Mommsen-Schule".

Da es leider Probleme gibt, wenn man unter JavaScript zwei Floats addiert, subtrahiert, multipliziert oder dividiert, habe ich vier kleine Funktionen geschrieben. Mittlerweile sind noch ein paar Vereinfachungen für z.B. Wurzeln und Logarithmen hinzugekommen, außerdem habe ich ein paar zusätzliche Funktionen zum Ändern des Zahlensystems zwischen Römisch, Dezimal oder anderen Systemen zwischen dem binären (2) und dem 36.

Ich wollte mich gestern mit einer weiteren Funktion für Fakultäten beschäftigen. Ganzzahlige Fakultäten sind dabei nicht das Problem. Eher problematisch wird es, bei negativen Fakultäten zwischen 0 und -1 und Fakultäten von Nicht-Ganzen-Zahlen. Auf Wikipedia habe ich zwar bereits Informationen gefunden, die haben mir jedoch nur bei 0.5er-Schritten geholfen. Die Fakultät aus 2,4 kann ich leider noch immer nicht (bzw. nicht korrekt) berechnen. Zum Errechnen der korrekten Fakultäten zur Kontrolle habe ich den Windows-Rechner verwendet, da dieser SOLCHE Fakultäten unterstützt.

Weitere Informationen zu dem Script findet ihr auf http://lars-sh.de/math-library/. Aktuell ist nur die Version 0.9 veröffentlicht. Die Entwickler-Version (1.0, wahrscheinlich später 0.9.5) findet ihr hier: http://lars-sh.de/math-library/math-library-1.0.html

Die Syntax für die Funktion MathExt.Factorial() ist ganz einfach: Das erste Argument ist die Zahl, das zweite gibt an, welche Fakultät gewählt wird (Doppelte, oder eine X-beliebige).

Schöne Grüße,
Lars Knickrehm

Das eyeOS-Projekt 2008: http://eyeos.org/de/
Internetauftritt | Übersetzungen | Entwicklung | Bildung

PS: Das JavaScript-Float-Problem ist unabhängig vom Browser. Ihr könnt es einfach testen:

document.write(String(3.21 + 3.1)); // 3.21 + 3.1 = 6.31 | Laut JS jedoch nicht: 6.3100 ... 005 :( document.write(String(3.21 - 3.1)); // 3.21 - 3.1 = 0.1 | Laut JS jedoch nicht :( document.write(String(5.27 * 3.83)); // 5.27 * 3.83 = 20.1841 | Laut JS jedoch nicht :( document.write(String(5.27 / 3.1)); // 5.27 / 3.1 = 1.7 | Laut JS jedoch nicht :(

RE: Fakultäten unter JavaScript 2008-06-26 19:58
UncleOwen
PS: Das JavaScript-Float-Problem ist unabhängig vom Browser.

Und unabhängig von der Programmiersprache. Liegt einfach daran, dass Fliesskommazahlen intern nicht exakt dargestellt werden. Was Dein rumhantieren mit Strings daran ändern soll, ist mir schleierhaft… wenn's dadurch "richtig" wird, ist das bestenfalls Zufall.

RE: Fakultäten unter JavaScript 2008-06-26 20:05
UncleOwen
Die Syntax für die Funktion MathExt.Factorial() ist ganz einfach: Das erste Argument ist die Zahl, das zweite gibt an, welche Fakultät gewählt wird (Doppelte, oder eine X-beliebige).

Fakultät? Die hat doch eignetlich nur 1 Argument. Welche Funktion genau meinst Du? Und ja, die Gamma-Funktion (Fortsetzung der Fakultät auf nicht-negativ-ganze Zahlen) ist über ein Integral definiert. Musst Du dann halt numerisch berechnen, wenn Du das willst… genauer wird's dadurch aber auch nicht.

RE: Fakultäten unter JavaScript 2008-06-26 20:08
UncleOwen
Achja, schau Dir mal http://de.wikipedia.org/wiki/Gleitkommazahl#Gleitkommazahlen_in_der_Digitaltechnik an.

RE: Fakultäten unter JavaScript 2008-06-26 20:25
TriPhoenix
PS: Das JavaScript-Float-Problem ist unabhängig vom Browser.

Und unabhängig von der Programmiersprache. Liegt einfach daran, dass Fliesskommazahlen intern nicht exakt dargestellt werden.

Hab ich auch erst gedacht, aber wenn man das mal mit C und float oder double probiert, gibts zwar bei der Multiplikation Fehler, aber die anderen drei werden da noch richtig gerechnet. Wäre natürlich mal interessant zu wissen, ob JavaScript noch weniger Genauigkeit hat.

RE: Fakultäten unter JavaScript 2008-06-26 20:51
UncleOwen
Wie haste das getestet? printf("%f")? Wenn ja, dann

If the precision is missing, it is taken as 6;

Mit anderen Worten: printf rundet, wenn mans nicht explizit anders verlangt.

RE: Fakultäten unter JavaScript 2008-06-26 21:28
Anonymer User
Schöne Grüße,
Lars Knickrehm

Das eyeOS-Projekt 2008: http://eyeos.org/de/
Internetauftritt | Übersetzungen | Entwicklung | Bildung

what will der Throll?
Werbung machen?

RE: Fakultäten unter JavaScript 2008-06-26 21:42
UncleOwen
Hey, das ist doch Klasse!

eyeOS ist eine neuer Typ der Betriebssysteme, bei dem jede Aktion innerhalb des Browserfensters stattfindet.

Hmm, Betriebssystem… Nein.

RE: Fakultäten unter JavaScript 2008-06-26 21:53
low_level
Die Entwickler-Version (1.0, wahrscheinlich später 0.9.5) findet ihr hier:

Lass diesen Quatsch bitte bleiben. Versionsnummern sollten niemals kleiner werden. Normalerweise heißt die Entwicklerversion 0.9.x oder 0.99.x und die "spätere" dann 1.0.

Roland

RE: Fakultäten unter JavaScript 2008-06-26 23:28
Lars Knickrehm
Schön, mit so vielen Antworten hatte ich noch nicht gerechnet.

Was Dein rumhantieren mit Strings daran ändern soll, ist mir schleierhaft… wenn's dadurch "richtig" wird, ist das bestenfalls Zufall.
Mir ist lediglich aufgefallen, dass dieses Problem nur dann auftritt, wenn die Zahl vor dem Komma nicht Null ist. Ich habe also nicht bewiesen, dass meine Möglichkeit zu 100% funktioniert, aber da alle Tests von mir und anderen glücklich abliefen, scheint das Problem wenigstens vorerst gebannt…

Fakultät? Die hat doch eigentlich nur 1 Argument.
Die Fakultät hat selbstredend nur ein Argument. Das zweite Argument der Funktion MathExt.Factorial() gibt an, ob du eine Doppelfakultät verwenden möchtest oder nicht. (siehe Wikipedia: http://en.wikipedia.org/wiki/Factorial#Double_factorial)

Werbung machen?
Naja, weshalb denn nicht, dann wisst ihr jedenfalls wofür ich die korrekte Berechnung benötige. (Um ehrlich zu sein kopiere ich den Text einfach immer, wenn ich am Ende eines Forenbeitrags, o.ä. bin und keine Signatur eingestellt habe.)

Normalerweise heißt die Entwicklerversion 0.9.x oder 0.99.x und die "spätere" dann 1.0.
Gemeint habe ich lediglich, dass ich aktuell denke die nächste Version 0.9.5 und nicht wie geplant 1.0 zu nennen, bis ich sicher bin, dass die Fakultäten richtig berechnet werden.

Letzten Endes ist das Problem nicht die Funktion MathExt.Add() oder eine andere, sondern lediglich MathExt.Factorial(), bei der ich Probleme habe (mathematisch gesehen!).
Wie kann ich "manuell" (d.h. auf einem "analogen" Zettel neben meinem Computer) "2,4!" ausrechnen?

Schöne Grüße,
Lars Knickrehm

Das eyeOS-Projekt 2008: http://eyeos.org/de/
Internetauftritt | Übersetzungen | Entwicklung | Bildung

RE: Fakultäten unter JavaScript 2008-06-27 14:24
TriPhoenix
If the precision is missing, it is taken as 6;

Mit anderen Worten: printf rundet, wenn mans nicht explizit anders verlangt.

Ohje, C ist ekliger als ich dachte…