2011-06-23 17 views
12

浮動小数点計算にはlong doubleタイプ(80ビット)を使用する中規模のC99プログラムがあります。新しいGCC 4.6の拡張子__float128で精度を向上させたい。私が得たように、これはソフトウェアエミュレートされた128ビット精度の計算です。Gccの使用方法4.6.0 x86とx86_64でlibquadmathと__float128を使用する

プログラムを80ビットの古典的なロング・ダブルから128ビットのクワッド・フロートに変換するにはどうすればよいですか? 私は何が変わる必要がありますか?コンパイラフラグ、ソース?

私のプログラムの精度は、strtodで、+ - */sin、cos、expなどの多くの操作を<math.h>から、printfから実行しています。

PS:float128はFortran(REAL * 16)に対してのみ宣言されていますが、libquadmathはC言語で書かれており、float128を使用しています。私はGCCがfloat128のオペレーションをランタイムライブラリに変換するかどうか確信していますが、私はソースからlong doubleから__float128への移行方法が不明です。

PPS: "C" 言語GCCモードのドキュメントがあります:。http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

「GNU Cコンパイラがサポートしています... 128ビット(TFmode)、フローティングタイプが追加タイプのサポートは、算術演算子が含まれています。 、加算、減算、乗算、を分割し、単項算術演算子、関係演算子、私はclassiから私のプログラムを変換する必要がありますどのように等価演算子は... __float128タイプはi386でサポートされている、x86_64" 版の

+0

libquadmathはhttp://gcc.gnu.org/onlinedocs/libquadmath/index.html#toc_Topです。これはhttp://gcc.gnu.org/gccに関するニュースです-4.6/changes.html "__float128は、32ビットx86、x86-64およびItaniumアーキテクチャ上のターゲットで利用可能です。__float128は、__float128データ型のターゲットに対して4倍精度の数学関数を提供するLGPLライセンスlibquadmathライブラリとともに提供されます。 " – osgx

+0

その基本的な操作は' glibc/soft-fp'によって行われます。例えば '__subtf3()' http://koala.cs.pub.ro/lxr/#glibc+2.9/soft-fp/subtf3.c# L35 http://gcc.gnu.org/wiki/Software_floating_point – osgx

+1

libquadmathを使用して、[strtoflt128](http://webcache.googleusercontent.com/search?q=cache:P0PwG_dRv4EJ:gcc.gnu.org/onlinedocs)を使用することができます。 /libquadmath.ps.gz+&cd=1&hl=en&ct=clnk&client=ubuntu)を 'strtod' replacemとして追加しますent。 –

答えて

21

完全な精度のソフトウェアエミュレーションで、128ビットの80ビットから4倍の浮動小数点数の倍精度浮動小数点数何が変わる必要がありますか?コンパイラフラグ、ソース? (; IA64およびHPPAで新しいGCCとx86 and x86_64 targets上でのみサポート)

あなたは、最近のソフトウェア、__float128タイプ(4.6以降)とlibquadmathのサポートとGCCのバージョンが必要です。あなたは、マクロや関数定義を持っている#include <quadmath.h>ヘッダを追加

    • cannot find -lquadmath'あなたは何libquadmathがインストールされていないことが表示されます)リンカフラグ -lquadmathを追加する必要があります。
    • long doubleの変数定義をすべて__float128に変更する必要があります。
    • 複素変数はすべて、単純な算術演算を自動的GCC(__*tf3()ようなヘルパー関数の呼び出しに変換される)によって処理され__complex128タイプ(quadmath.h)に変更または直接typedef _Complex float __attribute__((mode(TC))) _Complex128;
    • とすることができます。
    • あなたがLDBL_*のような任意のマクロを使用する場合は、FLT128_*(完全なリストhttp://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)に置き換えて
    • あなたは倍精度でパイ(M_PI)またはE(M_E)のようないくつかの特定の定数が必要な場合は、qサフィックスと定義済みの定数を使用します( M_*q)、1.3000011111111Q
    • よう
    • ユーザー定義の定数はQ接尾語で書かれてM_PIqM_Eq(完全なリストhttp://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)、のようなすべての数学関数呼び出しを交換する必要がありますウィット
    • (警告は、古いlibquadmathsでダブルチェックを行い、strtoflt128でいくつかのバグがあるかもしれません) http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128 - 文字列からクワッドフロートを読む sqrtq()のような時間 *qバージョン、 sinq()(完全なリスト http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines
    • __float128 strtoflt128 (const char *s, char **sp)で行われるべきです
    • __float128の印刷は、quadmath_snprintf機能の助けを借りて行われます。最近のglibcを使ったLinuxディストリビューションでは、libquadmathによって自動的に関数が登録され、Qqでもかまいません)の長さ修飾子がの変換指定子ですべてprintf s/sprintf sのように、double doubleの場合はLになります。例:printf ("%Qe", 1.2Q)http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf

    はまた、オプション-fdefault-real-8が与えられ、何のオプション-fdefault-double-8があったなかった場合は4.6以降のgfortranは、DOUBLE PRECISIONのため__float128タイプを使用することを、知っている必要があります。これは、ソフトウェアの計算のために、128のlong doubleが多くのプラットフォームで標準のlong doubleよりはるかに遅いため、問題になる可能性があります。 (投稿者:glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html

  • 関連する問題