long double
と呼ばれるC89(ANSI C)標準のデータ型がありますが、long double
(<math.h>
)をサポートする算術関数はありません。たとえば、sin
関数は、long
引数を受け入れます。long doubleはANSI Cで便利ですか?
C99はlong double
の数学関数をサポートしています。
私の質問は、ANSI Cでlong double
をサポートする数学的関数がない場合、long double
は役に立ちますか?
long double
と呼ばれるC89(ANSI C)標準のデータ型がありますが、long double
(<math.h>
)をサポートする算術関数はありません。たとえば、sin
関数は、long
引数を受け入れます。long doubleはANSI Cで便利ですか?
C99はlong double
の数学関数をサポートしています。
私の質問は、ANSI Cでlong double
をサポートする数学的関数がない場合、long double
は役に立ちますか?
倍精度以上の式を計算する場合は、「long double」は絶対に便利です。
興味深いのは「正確にははです。
答えは依存プラットフォームおよび/またはコンパイラです:あなたはそれを自分で作ることができないという意味ではありません何かをサポートしていません
という理由だけでのmath.h。
既存の型は良いものです。これは、長さに等しいかそれ以上の精度で何かを要求するクロスプラットフォームの方法があることを意味するためです。これは、どこかの言語でない場合にはできませんでした(最善の策は、構造体やlong/double型の配列と一緒に何かをハックすることです)。
機能は便宜上のものです。ときどき組み込みのsinプロセッサ関数を使うことができますが、時にはそうではなく、代わりにsin関数には標準的な操作を使って答えを出すか、または見上げるアルゴリズムが含まれています。
必要に応じて、ターゲットプラットフォームのsinl関数をC99からC89にコピーできます。ここに実装の大きなリストがあります:http://sourceware.org/git/?p=glibc.git;a=tree;f=sysdeps/ieee754;hb=HEAD
またはC99に固執してください。
'+'、 '-'、' * '、'/'はどうですか? –
最良の結果のために 'long double'を使用したこれらのタイプのアプリケーションでは、+、 - 、*、/は十分ではありません。 x86_64 floatの場合は –
で、SSEに置き換えられています。しかし、少なくともGCC long doubleではfloatとdoubleがSSEを使用する場合でもx87を使用します。したがって、コードの一部にx87を使用したい場合、long doubleはそれに到達する1つの方法です。 MSVCでは、long doubleはdoubleと同義語に見えますが、doubleを使用するとx87を得られません。おそらくあなたの質問は:x87はまだ(互換性のために)便利ですか、または80ビットの浮動小数点はまだ有用ですか?それは興味深い質問です。 –