2011-08-10 20 views
1

aをbとすると、変数は_int64です。 sqrt((long double)a)*sqrt((long double)b)を高精度の80ビット浮動小数点で計算する必要があります。C/C++での80ビット浮動小数点演算

例。 (__int64)(sqrt((long double)a)*sqrt((long double)a) + 0.5) != aは多くの場合そうであるはずです。

どのwin32 C/C++コンパイラが80ビット浮動小数点演算を管理できますか?

+1

C **または** C++コンパイラ? * one *を選択するか、明示的に両方が必要だと明言してください。 –

+1

'long double sqrtl(long double x);' –

+0

WTP:win32/amd64用のCまたはC++コンパイラです。私には関係ありません。 – amuliar

答えて

2

整数の平方根を取るのに浮動小数点を使用しないでください。特に、long doubleがサポートされておらず、一部のシステムでおおよその(正確ではない)sqrtlがあるかもしれません。代わりに、整数平方根アルゴリズムを調べます。

+0

難しいですが、私は対数方程式(limから64ビット整数)の解法を探していますが、INTEGER NUMBER sqrtl(a)* sqrtl(b)の形式は可能な解を最も簡単に表現しています。 – amuliar

+0

I浮動小数点を使用せずに整数の平方根を直接実行できる方法があることを意味します。 –

1

EmbarcaderoのC++ Builderは80ビットの浮動小数点を処理します。 long double型、または(Delphiからインポートされた)Extnded型を使用します。彼らは同じです。

+0

はい、80ビットですが、失敗します。 a = 8642673492431640625L; 結果:Delphiでの結果:8642673492431640624 Borland C++コンパイラ5.5:8642673492431640200 – amuliar

+0

OK、私は試しました: 'unsigned __int64 a = 8642673492431640625L; long double ld = a; printf( "%0.1Lf \ n"、ld); 'それは正しいと思われる' 8642673492431640625.0'を表示します。それはC++ Builder XEにありました。 –

2

sqrt()がlong doubleに有効ですか?

少なくともいくつかの環境では、sqrt()はdouble型、sqrtf()はfloat型、sqrtl()はlong double型です。

+0

はい。 math.hはバージョンを持っています:long double sqrt(long double) – amuliar

+1

''で宣言された 'sqrt()'関数はdouble型ではなく、倍精度型であることは間違いありません。 'sqrtl()'はlong double型です。しかし、 ''に定義されている "タイプジェネリックマクロ" 'sqrt()'もあります(あなたのコンパイラがそれをサポートしていれば、それは比較的新しい機能です)。 –

+0

@amuliar: "sqrt"ではなく "sqrtl"と呼ばれています。 –

関連する問題