2012-03-24 13 views
1

Es gibt einen Datentyp in C89 (ANSI C) Standard mit der Bezeichnung long double, aber es gibt keine mathematische Funktion zur Unterstützung von long double (<math.h>). Zum Beispiel akzeptiert sin Funktion ein long Argument.Ist lange doppelt nützlich in ANSI C?

C99 unterstützt mathematische Funktionen für long double.

Meine Frage ist, wenn es keine mathematischen Funktionen zur Unterstützung long double in ANSI C gibt, ist long double nützlich?

+8

Was ist mit '+', '-',' * 'und'/'? –

+0

Für diese Art von Anwendungen, die 'long double' für die besten Ergebnisse verwendet haben, sind +, -, *,/nicht ausreichend. –

+0

für x86_64 Float und wurden durch SSE ersetzt. Allerdings nutzt zumindest bei GCC Long Double noch x87, auch wenn Float und Double SSE verwenden. Also, wenn man x87 für einen Teil des Codes verwenden möchte, ist ein langer Weg ein Weg, um zu ihm zu gelangen. Mit MSVC scheint long double nur ein Synonym für double zu sein, also wird es nicht x87 bringen, wenn double SSE verwendet. Vielleicht war deine Frage: ist x87 immernoch nützlich (nebenbei für kompatibel) oder ist 80-Bit Gleitkomma noch brauchbar? Das ist eine interessante Frage. –

Antwort

0

Ja, "long double" ist absolut nützlich, wenn Sie einen Ausdruck mit mehr als doppelter Genauigkeit berechnen möchten.

Eine interessante Nebenfrage ist "Was genau IST 'lang double'"?

Die Antwort ist plattform- und/oder Compiler abhängig:

http://en.wikipedia.org/wiki/Long_double

0

Nur weil math.h etwas nicht unterstützt bedeutet nicht, Sie es nicht selbst machen kann.

Der vorhandene Typ ist eine gute Sache, weil es bedeutet, dass es eine plattformübergreifende Möglichkeit gibt, etwas mit mehr oder gleicher Genauigkeit zu einem langen zu fordern. Dies könnte nicht gemacht werden, wenn es nicht irgendwo in der Sprache wäre (am besten wäre es, etwas zusammen mit einer Struktur oder einem Array von Longs/Doubles zu hacken).

Die Funktionen sind nur für die Bequemlichkeit; manchmal kann eine eingebaute sin-prozessorfunktion verwendet werden, aber manchmal nicht, und stattdessen enthält die sin-funktion einfach einen algorithmus, um die antwort zu erzeugen, oder sie nachzuschlagen, indem sie standardoperationen verwendet.

Sie könnten die sinl-Funktionen für Ihre Zielplattform von C99 nach C89 kopieren, wenn Sie wollten. Es gibt eine große Liste von Implementierungen hier: http://sourceware.org/git/?p=glibc.git;a=tree;f=sysdeps/ieee754;hb=HEAD

Oder einfach bei C99 bleiben.