5

値の切り捨てがないように浮動小数点数を出力でき ( を使用setpercision)、数値が固定表記で出力された場合 ( を使用fixed)、浮動小数点数をバッファに格納できますか?

浮動小数点型の小数部分の最大の基数 10 の値の場所を教えてくれるa#defineまたは何かのようなものが標準にあることを願っています。numeric_limits

ここで、浮動小数点型の小数部分の基数 10 の最大桁数について尋ねました: 浮動小数点数の整数部分の基数 10 の最大数は何ですか

しかし、これはもっと複雑かもしれません。たとえば1.0 / 3.0、無限に繰り返される一連の数字です。書式設定を使用して出力すると、fixed0 を繰り返す前に次のように多くの場所が取得されます。

0.33333333333333314829616256247390992939472198486328125

しかし、それが最大の精度であるとは必ずしも言えません。浮動小数点の小数部で実際に表現された末尾の 0 の数がわからず、負の指数によってシフトダウンされていないためです。

私たちが持っていることは知っていますmin_exponent10が、これを探す必要がありますか?

4

5 に答える 5

6

32 ビットと 64 ビットの IEEE 754 数値を考慮すると、次のように計算できます。

2 の負の累乗がすべてです。各指数がどのように寄与するかを見てみましょう。

2^-1 = 0.5         i.e. 1 digit
2^-2 = 0.25        i.e. 2 digits
2^-3 = 0.125       i.e. 3 digits
2^-4 = 0.0625      i.e. 4 digits
....
2^-N = 0.0000..    i.e. N digits

基数 10 の数値は常に 5 で終わるため、指数が 1 減少すると、基数 10 の桁数が 1 増加することがわかります。したがって、2^(-N) には N 桁が必要になります。

また、これらの寄与を加算すると、結果の桁数は最小の数によって決定されることに注意してください。したがって、見つける必要があるのは、寄与できる最小の指数です。

32 ビット IEEE 754 の場合:

最小指数 -126

小数ビット 23

したがって、最小の指数は -126 + -23 = -149 であるため、最小の寄与は 2^-149 から得られます。

基数 10 で印刷された 32 ビット IEEE 754 の場合、149 桁の小数部が存在する可能性があります。

64 ビット IEEE 754 の場合:

最小指数 -1022

小数ビット 52

したがって、最小の指数は -1022 + -52 = -1074 であるため、最小の寄与は 2^-1074 から得られます。

基数 10 で印刷された 64 ビット IEEE 754 の場合、1074 桁の小数部が存在する可能性があります。

于 2016-10-03T19:11:17.543 に答える
2

私は、標準が、要求している数値を指定するための定義済みの定数を提供していない (そして、他の制限を課すことなく提供できない) ことを合理的に確信しています。

浮動小数点はほとんどの場合、基数 2 で表されますが、基数 16 と基数 10 もかなり広く使用されています。

これらすべての場合において、基数 (2 および場合によっては 5) の唯一の因数も 10 の因数です。その結果、それらを基数 10 (10 進数) に変換するときに、無限に繰り返される数を得ることはありません。

ただし、標準は浮動小数点をそのような表現に制限していません。理論的には、誰かが本当に望むなら、浮動小数点表現に (たとえば) 基数 3 または基数 7 を使用できます。もしそうなら、10 進数に変換されたときに無限に繰り返される数値を格納するのは簡単です。たとえば、基数 3 の 0.1 は 1/3 を表し、基数 10 に変換すると無限に繰り返されます。これを行っている人は聞いたことがありませんが、そのような実装は標準の要件を満たすことができると思います。

典型的なバイナリ表現でmin_exponentは、おそらく必要な値の妥当なプロキシになるはずです。残念ながら、それよりも正確に物事を述べるのはおそらく不可能です.

たとえば、実装はメモリに格納するよりも高い精度で中間値を格納することが許可されているため、(たとえば)1.0/3.0ソース コードで文字どおりに指定した場合、結果は、ペアを読み取って生成された値と実際には異なる可能性があります。 1 と 3 を入力し、それらを分割します。前者の場合、除算はコンパイル時に実行される可能性があるため、出力される結果は のサイズで、double余分なものはありません。実行時に 2 つの値を入力すると、実行時に除算が実行され、より精度の高い結果が得られる場合があります。

標準では、浮動小数点の基数が として文書化されることも必要ですstd::numeric_limits<T>::radix。これに基づいて、基数の素因数が 10 の素因数と共有されている限り、基数min_exponentに基づいて小数点以下の最大桁数の概算を計算できます。

于 2016-10-03T17:07:56.763 に答える
1

「小数部に含まれる桁数」を実際に知りたいわけではありません。このステートメントは、浮動小数点表現の内部で何が起こっているのか 100% 明確ではないことを示しています。整数部分と小数部分に個別の精度はありません。

本当に知りたいのは表現の精度です

1) 32 ビットの単精度 IEEE754 数値には 24 の仮数ビットがあり、約24 * log10(2) = 7.2桁の精度が得られます。

2) 64 ビットの倍精度 IEEE754 数値には 53 の仮数ビットがあり、約53 * log10(2) = 16.0桁の精度が得られます。

倍精度数を扱っているとします。0 と 1 の間など、非常に小さい 10 進数の場合、小数点以下の精度は約 16 桁になります。これが1.0/3.0上記の例です。答えが 0.3 の繰り返しであることはわかっていますが、答えが無意味になる前に、小数点の後に 16 個の 3 があります。

非常に大きな数、たとえば 10 億を 3 で割った場合 ( 1000000000.0/3.0)、私のマシンでは、答えは次のようになります。

1000000000.0/3.0 = 333333333.333333313465118

この場合、約 16 桁の精度がありますが、精度は整数部分と小数部分に分割されます。整数部分には 9 桁の正確な数字があり、小数部分には 7 つの正確な数字があります。小数部の 8 桁以降はガベージです。

同様に、1 京 (18 個のゼロ) を 3 で割るとします。私のマシンで:

1000000000000000000.0/3.0 = 333333333333333312.000000000000000

まだ 16 桁の精度がありますが、これらの桁のゼロは小数点以下です。

于 2016-10-03T15:49:38.000 に答える
0

std::numeric_limits<double>::min_exponent

基数を (min_exponent-1) に累乗した最小の負の整数値は、正規化された浮動小数点数を生成します。浮動小数点型の FLT_MIN_EXP、DBL_MIN_EXP、または LDBL_MIN_EXP と同等です。

min_exponent10も利用できます。

10 をその累乗すると正規化された浮動小数点数が生成される最小の負の整数値。浮動小数点型の FLT_MIN_10_EXP、DBL_MIN_10_EXP、または LDBL_MIN_10_EXP と同等です。

于 2016-10-03T15:29:53.443 に答える