23 Stimmen

Welche Programmiersprachen unterstützen Arithmetik mit beliebiger Genauigkeit?

Welche Programmiersprachen unterstützen Arithmetik mit beliebiger Genauigkeit und können Sie ein kurzes Beispiel dafür geben, wie man eine beliebige Anzahl von Ziffern ausgibt?

5voto

sanxiyn Punkte 3610

Viele Leute haben das Dezimalmodul von Python empfohlen, aber ich würde die Verwendung von mpmath für alle ernsthaften numerischen Verwendungszwecke dem Dezimalsystem vorzuziehen.

0 Stimmen

Wie der Name schon sagt, ist Decimal für die Verwendung von Dezimalzahlen (zur Basis 10) gedacht, was für einige Zwecke (Finanzberechnungen usw.) sehr wichtig ist, aber für arithmetische Zwecke nicht sehr effizient. Andere Module führen Arithmetik auf Basis-2-bezogenen Ziffernblöcken durch. mpmath und gmpy sind sehr effizient, wenn es auf Geschwindigkeit ankommt.

4voto

Oli Punkte 1742

COBOL

77 VALUE PIC S9(4)V9(4). 

eine Variable mit Vorzeichen, die 4 Dezimalstellen hat.

PL/1

DCL VALUE DEC FIXED (4,4);

:-) An die anderen alten Sachen kann ich mich nicht mehr erinnern...

Scherz beiseite, wie mein Beispiel zeigt, sollte man eine Programmiersprache nicht nach einer einzigen Funktion auswählen. Praktisch alle Anständige und aktuelle Sprachunterstützung, korrigierte Genauigkeit in einigen speziellen Klassen.

0 Stimmen

Das sollten Sie, wenn Sie die Sprache nur für diese eine Aufgabe verwenden wollen.

0 Stimmen

@Oli Der Auftraggeber wollte jedoch eine beliebige Genauigkeit, und keines Ihrer Beispiele zeigt dies.

3voto

jottos Punkte 19628

Scheme (eine Abwandlung von Lisp) verfügt über eine Fähigkeit namens "bignum". Es gibt viele gute Scheme-Implementierungen, sowohl in vollständigen Sprachumgebungen als auch mit eingebetteten Skriptoptionen. Für einige kann ich mich verbürgen

MitScheme (auch als gnu scheme bezeichnet) PLTScheme Chezscheme Guile (auch ein gnu-Projekt) Schema 48

3voto

Martin Vahi Punkte 31

Ruby-Ganzzahlen und Gleitkommazahlen (mathematisch gesprochen: rationale Zahlen) sind standardmäßig nicht streng an die klassischen CPU-bezogenen Grenzen gebunden. In Ruby werden Ganzzahlen und Fließkommazahlen automatisch und transparent auf einige "Bignum-Typen" umgestellt, wenn die Größe das Maximum der klassischen Größen überschreitet.

Wahrscheinlich möchte man eine einigermaßen optimierte und "vollständige", vielseitige mathematische Bibliothek verwenden, die die "Bignums" nutzt. Dies ist der Punkt, an dem die Mathematica-ähnliche Software mit ihren Fähigkeiten wirklich glänzt.

Seit 2011 ist Mathematica extrem teuer und in Bezug auf Hacking und Reshipping sehr eingeschränkt, vor allem, wenn man die Mathematiksoftware als Bestandteil einer kleinen, niedrigpreisigen Webanwendung oder eines Open-Source-Projekts anbieten möchte. Wenn man nur rohes Number Crunching benötigt, bei dem keine Visualisierungen erforderlich sind, dann gibt es eine sehr brauchbare Alternative zu Mathematica und Maple. Die Alternative ist das REDUCE Computer Algebra System, das auf Lisp basiert, quelloffen und ausgereift ist (seit Jahrzehnten) und sich in aktiver Entwicklung befindet (im Jahr 2011). Wie Mathematica verwendet REDUCE symbolische Berechnungen.

Zur Anerkennung von Mathematica sage ich, dass Mathematica seit 2011 meines Erachtens die beste Lösung für interaktive Visualisierungen ist, aber ich denke, dass es vom Standpunkt der Programmierung aus bequemere Alternativen gibt, selbst wenn Mathematica ein Open-Source-Projekt wäre. Ich habe den Eindruck, dass Mathematica auch etwas langsam ist und sich nicht für die Arbeit mit großen Datensätzen eignet. Ich habe den Eindruck, dass die Nische von Mathematica die theoretische Mathematik ist, und nicht das Zahlenrechnen im wirklichen Leben. Andererseits beherbergt und unterhält der Herausgeber von Mathematica, Wolfram Research, eine der qualitativ hochwertigsten, wenn nicht sogar DIE qualitativ hochwertigste, kostenlos nutzbare mathematische Referenzsite auf dem Planeten Erde: die http://mathworld.wolfram.com/ Das Online-Dokumentationssystem, das mit Mathematica mitgeliefert wird, ist ebenfalls sehr gut.

Wenn es um Geschwindigkeit geht, dann ist es erwähnenswert, dass REDUCE sogar auf einem Linux-Router laufen soll. REDUCE selbst ist in Lisp geschrieben, aber es kommt mit 2 eigenen, spezifischen Lisp-Implementierungen. Eine der Lisp-Implementierungen ist in Java und die andere in C implementiert. Beide funktionieren anständig, zumindest vom mathematischen Standpunkt aus. REDUCE hat 2 Modi: den traditionellen "Mathe-Modus" und einen "Programmier-Modus", der vollen Zugriff auf alle Interna durch die Sprache erlaubt, in der REDUCE selbst geschrieben ist: Lisp.

Meiner Meinung nach kann man also, wenn man sich den Aufwand ansieht, der nötig ist, um Mathe-Routinen zu schreiben, ganz zu schweigen von all den symbolischen Berechnungen, die alle in REDUCE enthalten sind, enorm viel Zeit sparen (buchstäblich Jahrzehnte), wenn man den größten Teil der Mathematik in REDUCE erledigt, vor allem, wenn man bedenkt, dass REDUCE von professionellen Mathematikern über einen langen Zeitraum getestet und getestet wurde, für symbolische Berechnungen auf Supercomputern der alten Ära für echte professionelle Aufgaben verwendet wurde und auf modernen Low-End-Computern wunderbar und wirklich schnell funktioniert. Es ist mir auch noch nie abgestürzt, im Gegensatz zu mindestens einem kommerziellen Paket, das ich hier nicht nennen möchte.

http://www.reduce-algebra.com/

Zur Veranschaulichung, wo die symbolische Berechnung in der Praxis wesentlich ist, bringe ich ein Beispiel für die Lösung eines Systems linearer Gleichungen durch Matrixinversion. Um eine Matrix zu invertieren, muss man Determinanten finden. Die Rundung, die bei den direkt von der CPU unterstützten Fließkommatypen stattfindet, kann eine Matrix, die theoretisch eine Inverse hat, in eine Matrix verwandeln, die keine Inverse hat. Dies wiederum führt zu einer Situation, in der die Software die meiste Zeit gut funktioniert, aber wenn die Daten ein wenig "unglücklich" sind, stürzt die Anwendung ab, obwohl algorithmisch nichts in der Software falsch ist, außer der Rundung von Fließkommazahlen.

Die rationalen Zahlen mit absoluter Genauigkeit haben eine ernsthafte Einschränkung. Je mehr Berechnungen mit ihnen durchgeführt werden, desto mehr Speicher verbrauchen sie. Im Jahr 2011 kenne ich keine andere Lösung für dieses Problem, als vorsichtig zu sein und die Anzahl der mit den Zahlen durchgeführten Operationen im Auge zu behalten und dann die Zahlen zu runden, um Speicherplatz zu sparen, aber man muss die Rundung in einem sehr präzisen Stadium der Berechnungen durchführen, um die oben genannten Probleme zu vermeiden. Wenn möglich, sollte die Rundung ganz am Ende der Berechnungen als allerletzte Operation durchgeführt werden.

3voto

In PHP haben Sie BCMath. Sie müssen keine DLL laden oder ein Modul kompilieren. Unterstützt Zahlen jeder Größe und Genauigkeit, dargestellt als String

<?php

$a = '1.234';
$b = '5';

echo bcadd($a, $b);     // 6
echo bcadd($a, $b, 4);  // 6.2340

?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X