いdouble値に全精度で利用出力コンデンサcout?
-
23-08-2019 - |
質問
いっその答えを私 最後の質問 (なぜだかよくわかりませんようとは思わなかったのです。また印刷する double
を使用 cout
そのた丸がんを期待します。ください cout
印刷 double
を精密?
解決
あなたは std::cout
のstd::fixed
に直接精度を設定して使用することができます書式指定子ます。
double d = 3.14159265358979;
cout.precision(17);
cout << "Pi: " << fixed << d << endl;
あなたはfloatまたはdoubleの最大精度を得るために#include <limits>
ことができます。
#include <limits>
typedef std::numeric_limits< double > dbl;
double d = 3.14159265358979;
cout.precision(dbl::max_digits10);
cout << "Pi: " << d << endl;
他のヒント
を使用 std::setprecision
するます:
std::cout << std::setprecision (15) << 3.14159265358979 << std::endl;
ここで私が使用するものです。
std::cout << std::setprecision (std::numeric_limits<double>::digits10 + 1)
<< 3.14159265358979
<< std::endl;
基本的には限界パッケージは、種類のすべてのビルドの特性を持っている。
浮動小数点数のための特徴の一つは(ダブルロング/フロート/ダブル)digits10属性です。これは、ベース10内の浮動小数点数の精度(I正確な用語を忘れて)定義
を参照してください: http://www.cplusplus.com/reference/std/制限/ numeric_limits.html の
他の属性の詳細については。
のiostreamの方法は、一種の不格好です。それは私のために右の精度を計算したので、私は boost::lexical_cast
に使用して好みます。そして、のだhref="http://www.boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm#performance">ます。
#include <string>
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
using std::string;
double d = 3.14159265358979;
cout << "Pi: " << lexical_cast<string>(d) << endl;
出力:
パイ:3.14159265358979
こちらではの表示をダブル全精度:
double d = 100.0000000000005;
int precision = std::numeric_limits<double>::max_digits10;
std::cout << std::setprecision(precision) << d << std::endl;
このディスプレイ
100.0000000000005
max_digits10の桁数に必要な独自のユニークなすべての日付と時刻を表すdouble値です。max_digits10の桁数前後の小数点以下の桁数です。
なset_precision(max_digits10)std::固定です。
固定表記set_precision()セットの桁数 後 小数点以下の桁数です。こが間違ってmax_digits10の桁数 前 や 後 小数点以下の桁数です。
double d = 100.0000000000005;
int precision = std::numeric_limits<double>::max_digits10;
std::cout << std::fixed << std::setprecision(precision) << d << std::endl;
この表示誤った結果:
100.00000000000049738
注意:ヘッダファイルに必要な
#include <iomanip>
#include <limits>
完全な精度では、私が意図した値に最も近似を表示するのに十分な精度を意味すると仮定し、double
が正確1.1
のように些細な何かを表現することはできませんベース2表現とベース2を使用して格納されていることを指摘しなければなりません。 (NO ROUNDオフERRORで)実際の二重のの完全フルの精度を得るための唯一の方法は、バイナリビット(又は六角ニブル)を印刷することです。これを行う方法の1つは、ビットの整数値をプリントアウトし、その後double
にunion
を書いされます。
union {
double d;
uint64_t u64;
} x;
x.d = 1.1;
std::cout << std::hex << x.u64;
これは、あなたの二重の100%正確な精度を与える...そして人間はIEEE倍精度形式を読み取ることができないので、全く読めなくなります! ウィキペディアには、バイナリビットを解釈する方法について良い書き込みをアップしています。
新しいC ++では、
を行うことができますstd::cout << std::hexfloat << 1.1;
どんな印刷
double
値全精度で利用出力コンデンサcout?
使用 hexfloat
または
使用 scientific
設定精度
std::cout.precision(std::numeric_limits<double>::max_digits10 - 1);
std::cout << std::scientific << 1.0/7.0 << '\n';
// C++11 Typical output
1.4285714285714285e-01
多くの回答をアドレスの1)ベース2)固定の科学的レイアウトは3という事になります。多くの回答と 精密 を提供しない適切な値が必要です。そのためこの答えに古い問題です。
- 何なりますか?
A double
確かに符号化されたベース2.直接的アプローチとC++11印刷用 std::hexfloat
.
すれば、小数点出力る場合がありますので使用を避けて行われます。
std::cout << "hexfloat: " << std::hexfloat << exp (-100) << '\n';
std::cout << "hexfloat: " << std::hexfloat << exp (+100) << '\n';
// output
hexfloat: 0x1.a8c1f14e2af5dp-145
hexfloat: 0x1.3494a9b171bf5p+144
- それ以外の場合:
fixed
またはscientific
?
A double
は 浮動小数点 タイプではなく、 固定小数点.
い ない 使用 std::fixed
とにエラーが発生した場合に印刷小 double
としても 0.000...000
.大 double
, で版画の桁数をも 百 疑informativeness.
std::cout << "std::fixed: " << std::fixed << exp (-100) << '\n';
std::cout << "std::fixed: " << std::fixed << exp (+100) << '\n';
// output
std::fixed: 0.000000
std::fixed: 26881171418161356094253400435962903554686976.000000
印刷の完全精度で使用 std::scientific
る"書浮動小数点値科学表記法".知のデフォルトの6桁の小数点以下では、不十分な金額の取扱いに来ます。
std::cout << "std::scientific: " << std::scientific << exp (-100) << '\n';
std::cout << "std::scientific: " << std::scientific << exp (+100) << '\n';
// output
std::scientific: 3.720076e-44
std::scientific: 2.688117e+43
- どのくらいの精度(どのように多くの合計桁)?
A double
符号化を用のバイナリーベース2コードと同じ精度と各国の2.この53ビット.
[1.0...2.0)が253 異なる double
,
[2.0...4.0)253 異なる double
,
[4.0...8.0)が253 異なる double
,
[8.0...10.0)2/8*253 異なる double
.
その一方でコードプリント数と N
桁の番号の組み合わせに[1.0...10.0)9/10*10N.
何 N
精密選択があるわけではありませんが、一対一のマッピング double
および小数です。 場合に固定 N
選択したものになるそうですが本当に必要な一定の double
値です。このエラーの数が少なすぎる(a)
以下では多すぎる(b)
ます。
3候補 N
:
a)を使用 N
がに変換するテキストdouble
テキストパフォーマンスに終わってしまのテキストのすべて double
.
std::cout << dbl::digits10 << '\n';
// Typical output
15
b)を使用 N
がに変換する double
-テキストdouble
パフォーマンスに終わってしま同 double
すべての double
.
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
時 max_digits10
はございませんが、その拠点を2拠点で10の属性 digits10 + 2 <= max_digits10 <= digits10 + 3
, 利用するとともに、 digits10 + 3
を保証するために十分な小数桁の数字で印刷されます。
c)利用する N
によって変化する値です。
この時に役立つ可能性があコードしたい表示に最小限のテキストN == 1
又は 正確な 価値の double
(N == 1000-ish
の場合 denorm_min
).さらに、これは"仕事"をしながOPの目標が設定されます。
通常、b)に使用される"印刷 double
値全精度で".一部のアプリケーション。a)エラーを提供していないすぎます。
と .scientific
, .precision()
設定の桁数で印刷後の小数点、 1 + .precision()
桁の数字で印刷されます。コードのニーズ max_digits10
合計桁の数字で .precision()
呼び出されると max_digits10 - 1
.
typedef std::numeric_limits< double > dbl;
std::cout.precision(dbl::max_digits10 - 1);
std::cout << std::scientific << exp (-100) << '\n';
std::cout << std::scientific << exp (+100) << '\n';
// Typical output
3.7200759760208361e-44
2.6881171418161356e+43
printf("%.12f", M_PI);
%。12Fは、12桁の精度で、浮動小数点を意味する。
COUTはあなたが印刷されたものの精度と書式を変更するために呼び出すことができる方法の束を持っているオブジェクトです。
てSetPrecision(...)操作がありますが、あなたはまた、印刷幅、などのような他のものを設定することができます。
あなたのIDEの参照でcoutのを検索します。
ほとんどの移植性...
#include <limits>
using std::numeric_limits;
...
cout.precision(numeric_limits<double>::digits10 + 1);
cout << d;
のostreamで::精度(int型)
cout.precision( numeric_limits<double>::digits10 + 1);
cout << M_PI << ", " << M_E << endl;
が得られます。
3.141592653589793, 2.718281828459045
なぜあなたは「+1」私は見当がつかないが、あなたはそれから抜け出す余分な数字が正しいと言っている。