2010-04-16 6 views
5

Ich habe gerade gelesen, dass C99 double_t hat, die mindestens so breit wie das Doppelte sein sollte. Bedeutet dies, dass es mehr Genauigkeitsziffern nach der Dezimalstelle gibt? Mehr als die üblichen 15 Ziffern für das Doppelte ?.double_t in C99

Zweitens, wie man es benutzt:

#include <float.h> 

genug nur inklusive? Ich habe gelesen, dass man den FLT_EVAL_METHOD auf 2 für Long double setzen muss. Wie macht man das? Da ich mit numerischen Methoden arbeite, möchte ich maximale Präzision, ohne eine beliebige Präzisions-Bibliothek zu verwenden.

Vielen Dank ...

Antwort

5

Nr. double_t ist mindestens so breit als doppelt; d.h. es könnte dasselbe wie doppelt sein. Fußnote 190 in dem C99-Standard macht die Absicht klar:

Die Typen float_t und double_t jeweils mindestens so breit als Schwimmer und Doppel bestimmt sind die Umsetzung der leistungsfähigsten Typen sein.

Wie Michael Burr bemerkte, können Sie FLT_EVAL_METHOD nicht einstellen.

Wenn Sie den breitesten Gleitkommatyp für ein beliebiges verfügbares System nur mit C99 verwenden möchten, verwenden Sie long double. Seien Sie sich jedoch bewusst, dass es auf einigen Plattformen dasselbe ist wie double (und könnte sogar dasselbe wie float sein).

Wenn Sie "mit numerischen Methoden arbeiten", sollten Sie sich darüber im Klaren sein, dass der Approximationsfehler der Methode für viele (geradzahligste) numerische Methoden sehr viel größer ist als der Rundungsfehler doppelter Genauigkeit profitieren Sie von der Verwendung breiterer Typen. Ausnahmen gibt es natürlich. An welcher Art von numerischen Methoden arbeiten Sie gerade?

Edit: ernst, entweder (a) nur long double verwenden und nennen es einen Tag oder (b) nehmen ein paar Wochen, um zu erfahren, wie Gleitkommazahlen tatsächlich auf den Plattformen implementiert, die Sie Targeting und was die tatsächlichen Genauigkeitsanforderungen für die Algorithmen sind, die Sie implementieren.

+0

Danke. Ist lang doppelt breiter als double_t? Das verwirrt mich. – yCalleecharan

+0

@yCleleecharan: Auf einigen Plattformen, ja, auf einigen Plattformen, nein. Unter OSX/Intel sind 'double' und' double_t' zum Beispiel IEEE-754 double, während 'long double' der x87 double-extended-Typ ist, der eine höhere Genauigkeit aufweist. Auf einer Plattform, auf der die Fließkomma-Arithmetik standardmäßig an die x87-Einheit gebunden ist (Windows, vielleicht?), Kann "double_t" mit "long double" identisch sein. Es ist unwahrscheinlich, dass "double_t" * breiter * als "long double" ist (wenn auch nicht unmöglich, IIRC). –

+0

In Bezug auf die numerischen Methoden, die ich verwende, sind es nur einfache Runge Kutta-Methoden 4. Ordnung zur Integration einer Reihe von ODEs. Ich musste meine Gleichungen nichtdimensionalisieren, um "schöne" Werte zu erhalten, da die Gleichungen nichtlinear sind und Nichtlinearität zu Chaosphänomenen führen kann. Ich benutze nichtlineare Werkzeuge wie ein Bifurkationsdiagramm und eine Poincare-Map. Da die Lösungen der ODEs empfindlich sind, versuche ich mit der bestmöglichen Präzision zu arbeiten. – yCalleecharan

1

Beachten Sie, dass Sie nicht bekommen FLT_EVAL_METHOD setzen - es wird von dem Compiler-Header gesetzt wird Sie bestimmen zu lassen, wie die Bibliothek bestimmte Dinge tut mit Punkt schweben.

Wenn Ihr Code sehr empfindlich auf die genaue Ausführung von Fließkommaoperationen reagiert, können Sie den Wert dieses Makros verwenden, um den Code bedingt zu kompilieren, um die für Sie wichtigen Unterschiede zu behandeln.

So zum Beispiel wissen Sie im Allgemeinen, dass double_t in allen Fällen mindestens ein double sein wird. Wenn Sie möchten, dass Ihr Code etwas anderes macht, wenn double_t ein long double ist, dann kann Ihr Code testen, ob FLT_EVAL_METHOD == 2 und entsprechend handeln.

Beachten Sie, dass, wenn FLT_EVAL_METHOD etwas anderes als 0, 1 oder 2 ist, Sie die Dokumentation des Compilers betrachten müssen, um genau zu wissen, welcher Typ double_t ist.

+0

Danke. Also kann ich diese Präzision nicht einstellen. Aber kann ich einfach eine Variable vom Typ double_t definieren, indem ich einfach float.h einschließe? – yCalleecharan

+0

Zu Ihrem zweiten Kommentar, können Sie mir bitte ein kurzes Beispiel geben, so wie ich seine Implementierung verstehe ... – yCalleecharan

+0

@yCleleecharan: ja, in diesem Fall sollten Sie "die effizientesten Typen der Implementierung mindestens so groß wie ... bekommen ". Mit anderen Worten, etwas, das möglicherweise genauer ist als "double", aber vielleicht nur ein normales "double". –

0

double_t kann durch typedef double double_t; definiert werden - natürlich, wenn Sie sich auf Implementierungsspezifika verlassen wollen, müssen Sie sich Ihre eigene Implementierung ansehen.

+0

Vielen Dank, dass Sie es implementiert haben. Aber muss ich float.h einbeziehen? – yCalleecharan