問題タブ [long-double]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++でのlong doubleの精度は?
long double
特定のプラットフォームでの精度を調べる方法を知っている人はいますか? を使用した場合と同じように、10 進数で 17 桁を超えると精度が低下しているようdouble
です。double
私のプラットフォームでは 8 バイトで表されるのに対し、long double
は 12 バイトで表されるため、さらに取得することが期待されます。
あなたが尋ねる前に、これは Project Euler のためのものなので、はい、17 桁以上が必要です。:)
編集:素早い返信ありがとうございます。私のシステムで を使用して、10 進数で 18 桁しか取得できないことを確認しlong double
ました。
floating-point - 80 ビットの拡張精度データ型のアプリケーションと利点は何ですか?
ええ、私は80-bitと言うつもりでした。あれはタイプミスじゃない…
私の浮動小数点変数の経験では、single (32 ビット)、double (64 ビット)、long double (96 ビットまたは 128 ビットと呼ばれる) などの 4 バイトの倍数が常に関係していました。そのため、 AIFF (Audio Interchange File Format) ファイルを読み書きするコードを作成しているときに、 80 ビットの拡張精度データ型に遭遇したとき、少し混乱しました。サンプリングを格納するために拡張精度変数が選択されました。オーディオトラックのレート。
ウィキペディアをざっと見てみると、 IEEE 754-1985 標準の概要に 80 ビット形式の簡単な言及と共に上記のリンクが見つかりました(ただし、IEEE 754-2008 標準の概要にはありません)。特定のアーキテクチャでは、「extended」と「long double」は同義語のようです。
私が遭遇していないことの 1 つは、拡張精度データ型 (もちろん、AIFF ファイルのサンプリング レートを除く) を利用する特定のアプリケーションです。これにより、私は疑問に思いました:
- 一部のプログラミングアプリケーションで拡張精度が必要/有益である状況に遭遇した人はいますか?
- 明らかな「double よりも精度が高いが、long double のほとんどの実装よりもバイト数が少ない」以外に、80 ビット浮動小数点数の利点は何ですか?
- その適用性は薄れていますか?
c++ - long double 出力の精度が正しくありません。何が間違っている可能性がありますか?
long double
const または not-const として設定している定数があります。long double
これは、テスト ワークステーションの精度 (19 桁) よりも長い (40 桁) です。
印刷すると、精度が 19 桁ではなく 16 桁で表示されます。
私がテストしているコードは次のとおりです。
コンパイル:
出力:
私は期待し0.6931471805599453094
ますが、代わりに取得し0.6931471805599452862
ます。
精度の 19 桁が 16 桁にカットされる理由はありますか?
ここに私の環境があります:
gcc の他のバージョンでも同じ問題が発生しています。
NTL や他のライブラリを調べることはできますが、何が原因なのか知りたいです。あなたの洞察に感謝します。
c - C のロングダブル
私はC Primer Plusの本を読んでいて、この例にたどり着きました
Macbook でこれを実行した後、次の出力に非常にショックを受けました。
そこで、よく調べてみると、long double を表示する正しい形式は を使用することであることがわかりました%Lf
。ただし、 Cygwin、Ubuntu、およびiDenebでabet
実行したときに取得した値ではなく、 double 値を取得した理由をまだ理解できません。
何か案は?
c++ - 実際の長倍精度は std::numeric_limits と一致しません
i686-apple-darwin10-g++-4.2.1 を使用して Mac OS X 10.6.2、Intel で作業し、-arch x86_64 フラグを使用してコンパイルしていると、...
...予想どおり、long double が実際に 308 を超える指数の値に設定されると、inf になります。つまり、実際には 80 ビットではなく 64 ビットの精度しかありません。
また、sizeof()
long double が 16 バイトであることを示しています。
最後に、 using<limits.h>
と同じ結果が得られ<limits>
ます。
不一致がどこにあるのか誰か知っていますか?
与える
4932
1e+308 inf
16
file - バイナリ ファイルの印刷と必要な精度
プロットのためにMatlabまたはGNUPlotにインポートできるように、浮動小数点数を含む1次元配列であるz1という変数をテキストファイルに出力しています。バイナリ ファイル (.dat) は .txt ファイルより小さいと聞いたことがあります。.txt ファイルへの出力に現在使用している定義は次のとおりです。
3 つの質問があります。
バイナリ ファイルはテキスト ファイルよりも本当にコンパクトですか?;
はいの場合、配列 z1 の値をバイナリ ファイルに出力できるように、上記のコードを変更する方法を知りたいです。fprintf を fwrite に置き換える必要があることを読みました。私の出力ファイルには、dodo.dat には配列 z1 の値が含まれ、1 行に 1 つの浮動小数点数が含まれている必要があると書かれています。
私のコードには %.16Le が含まれていますが、長い倍精度で 15 桁の精度があるため、%.15Le は正しいと思います。幅の位置にドット (.) を入れました。これにより、任意のフィールドに拡張して目的の数値を保持できると考えています。私は正しいですか?%.16Le の例として、1.0047914240730432e-002 のような出力を得ることができます。これにより、16 桁の精度が得られ、フィールドの幅は数値を正しく表示するのに適切な幅になります。幅の値ではなく、幅の位置にドット (.) を配置することをお勧めしますか?
どうもありがとう...
更新は次のように変更されています:
「wb+」への変更に加えて、よろしいですか?Matlab でバイナリ ファイルを読み取ることができません。
c++ - x86-64 long 倍精度
Intel 64 ビット プラットフォームでの long double の実際の精度は? 128または実際の128ビットにパディングされた80ビットですか?
前者の場合、gmp を使用する以外に、真の 128 精度を達成するための別のオプションはありますか?
visual-c++ - MSVCで拡張精度float(80ビット)をdouble(64ビット)に変換します
MSVC win32 / win64で拡張精度float(80ビット値、long double
一部のコンパイラーでも知られています)からdouble(64ビット)に変換するための最も移植性が高く「正しい」方法は何ですか?
long double
MSVCは現在(2010年現在)それがdouble
同義語であると想定しています。
おそらくインラインasmでfld
/fstp
アセンブラペアを記述できますが、MSVCのwin64コードではインラインasmを使用できません。このアセンブラコードを別の.asmファイルに移動する必要がありますか?それは本当にそうなので、良い解決策はありませんか?
c++ - ロングダブル対ダブル
使用しているシステムによって、さまざまなデータ型のサイズが変わる可能性があることを知っています。
私はXP 32ビットを使用しており、C++で演算子を使用すると、12バイトで8バイトのsizeof()
ようです.long double
double
ただし、ほとんどの主要な情報源は 8 バイトであると述べているlong double
ため、範囲はdouble
.
どうして 12 バイトなのですか? long double
12バイトだとすると、これも値の範囲が広がるのではないでしょうか?それとも、値が double の範囲を超え、したがって 8 バイトを超える場合にのみ、長い署名が使用されます (コンパイラの数値)。
c - printfとlongdouble
Windows上のNetbeansで最新のgccを使用しています。なぜ機能しないlong double
のですか?printf
指定子は間違っ%lf
ていますか?
コード:
出力: