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ビット浮動小数点演算を管理できますか?
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ビット浮動小数点演算を管理できますか?
整数の平方根を取るのに浮動小数点を使用しないでください。特に、long double
がサポートされておらず、一部のシステムでおおよその(正確ではない)sqrtl
があるかもしれません。代わりに、整数平方根アルゴリズムを調べます。
難しいですが、私は対数方程式(limから64ビット整数)の解法を探していますが、INTEGER NUMBER sqrtl(a)* sqrtl(b)の形式は可能な解を最も簡単に表現しています。 – amuliar
I浮動小数点を使用せずに整数の平方根を直接実行できる方法があることを意味します。 –
EmbarcaderoのC++ Builderは80ビットの浮動小数点を処理します。 long double型、または(Delphiからインポートされた)Extnded型を使用します。彼らは同じです。
はい、80ビットですが、失敗します。 a = 8642673492431640625L; 結果:Delphiでの結果:8642673492431640624 Borland C++コンパイラ5.5:8642673492431640200 – amuliar
OK、私は試しました: 'unsigned __int64 a = 8642673492431640625L; long double ld = a; printf( "%0.1Lf \ n"、ld); 'それは正しいと思われる' 8642673492431640625.0'を表示します。それはC++ Builder XEにありました。 –
sqrt()がlong doubleに有効ですか?
少なくともいくつかの環境では、sqrt()はdouble型、sqrtf()はfloat型、sqrtl()はlong double型です。
はい。 math.hはバージョンを持っています:long double sqrt(long double) – amuliar
'
@amuliar: "sqrt"ではなく "sqrtl"と呼ばれています。 –
C **または** C++コンパイラ? * one *を選択するか、明示的に両方が必要だと明言してください。 –
'long double sqrtl(long double x);' –
WTP:win32/amd64用のCまたはC++コンパイラです。私には関係ありません。 – amuliar