名前空間
変種
操作

std::numeric_limits::digits10

提供: cppreference.com
 
 
 
型サポート
型プロトタイプ
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20以前)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
(C++11)(C++20以前)(C++17)
 
 
static const int digits10;
(C++11以前)
static constexpr int digits10
(C++11およびそれ以降)

std::numeric_limits<T>::digits10 の値は、変化させずに T 型で表現可能な10進数の桁数です。 つまり、この数の有意な10進数の桁を持つ任意の数値は、丸めやオーバーフローによって変化することなく、 T 型の値に変換し、10進数の形式に戻すことができます。 radix 進数の型に対しては、これは digits (浮動小数点型に対しては digits-1) を log
10
(radix)
倍して切り捨てた値です。

[編集] 標準の特殊化

T std::numeric_limits<T>::digits10 の値
/* 非特殊化 */ 0
bool 0
char std::numeric_limits<char>::digits * std::log10(2)
signed char std::numeric_limits<signed char>::digits * std::log10(2)
unsigned char std::numeric_limits<unsigned char>::digits * std::log10(2)
wchar_t std::numeric_limits<wchar_t>::digits * std::log10(2)
char16_t std::numeric_limits<char16_t>::digits * std::log10(2)
char32_t std::numeric_limits<char32_t>::digits * std::log10(2)
short std::numeric_limits<short>::digits * std::log10(2)
unsigned short std::numeric_limits<unsigned short>::digits * std::log10(2)
int std::numeric_limits<int>::digits * std::log10(2)
unsigned int std::numeric_limits<unsigned int>::digits * std::log10(2)
long std::numeric_limits<long>::digits * std::log10(2)
unsigned long std::numeric_limits<unsigned long>::digits * std::log10(2)
long long std::numeric_limits<long long>::digits * std::log10(2)
unsigned long long std::numeric_limits<unsigned long long>::digits * std::log10(2)
float FLT_DIG /* IEEE float の場合は 6 */
double DBL_DIG /* IEEE double の場合は 15 */
long double LDBL_DIG /* 80 ビットの Intel の long double の場合は 18 */

[編集]

8ビットの2進数型はあらゆる2桁の10進数を正確に表現できますが、3桁の10進数 256〜999 は表現できません。 8ビット型に対する digits10 の値は2になります (8 * std::log10(2) = 2.41)。

標準の32ビット IEEE 754 浮動小数点型は24ビットの仮数部 (書き込まれた23ビットと暗黙の1ビット) を持ち、これは7桁の10進数を表現可能であることを示唆します (24 * std::log10(2) = 7.22) が、相対丸め誤差は一様でなく、7桁の10進数を持つ浮動小数点値のいくつかは32ビット浮動小数点への変換と戻りを生き延びることができません。 最も小さな正の例は 8.589973e9 であり、往復後は 8.589974e9 になります。 これらの丸め誤差は表現内の1ビットを超えることはなく、 digits10(24-1) * std::log10(2) = 6.92 として計算できます。 切り捨てると値 6 が結果となります。

同様に、16桁の文字列 9007199254740993 はテキスト→double→テキストの往復を生き延びることはできず、 9007199254740992 になります。 64ビット IEEE 754 の型 double は15桁の10進数に対してのみこの往復を保証します。

[編集] 関連項目

[static]
指定された型を表現するために使用される基数
(パブリック静的メンバ定数) [edit]
[static]
変化させずに表現可能な radix 進数の桁数
(パブリック静的メンバ定数) [edit]
有効な正規化浮動小数点値を構成する radix を底とした最も小さな負の指数より1大きい数
(パブリック静的メンバ定数) [edit]
有効な有限の浮動小数点値を構成する radix を底とした最も大きな指数より1大きい数
(パブリック静的メンバ定数) [edit]