標準の定義 (NPE の回答を参照) はあまり正確ではありませんね。代わりに、それは循環的で曖昧です。
IEC 浮動小数点標準には「不正確な」数の概念 (および計算によって不正確な数が得られる場合の不正確な例外) があることを考えると、これが名前の由来であると思われis_exact
ます。標準タイプのうち、は、、およびis_exact
に対してのみ false であることに注意してください。float
double
long double
その意図は、型が基礎となる数学的型のすべての数値を正確に表しているかどうかを示すことです。整数型の場合、基礎となる数学的型は整数の有限サブセットです。各整数型は、その型の対象となる整数のサブセットのメンバーのすべてを正確に表すため、is_exact
すべての整数型に当てはまります。浮動小数点型の場合、基礎となる数学型は、実数の有限範囲サブセットです。(有限範囲サブセットの例は、「0 と 1 の間のすべての実数」です。) 実数の有限範囲サブセットでさえ正確に表す方法はありません。ほとんどすべてが計算不能です。IEC/IEEE 形式では、事態はさらに悪化します。その形式では、コンピューターは有理数の有限範囲サブセットを正確に表すことさえできません (計算可能な数の有限範囲サブセットは言うまでもなく)。
is_exact
この用語の起源は、さまざまな浮動小数点表現モデルにおける「不正確な」数の長年の概念であると思われます。おそらくもっと良い名前だったでしょうis_complete
。
補遺
言語によって定義された数値型は、「数値」の表現のすべてではありません。固定小数点表現は本質的に整数であるため、それらも正確です (表現に穴はありません)。有理数を標準的な整数型 (たとえばint/int
) のペアとして表現することは正確ではありませんが、有理数をBignum
ペアとして表現するクラスは、少なくとも理論的には「正確」になります。
実物はどうですか?ほとんどすべての実数が計算可能ではないため、実数を正確に表す方法はありません。私たちがコンピューターでできる最善のことは、計算可能な数値です。それには、数値を何らかのアルゴリズムとして表す必要があります。これは理論的には役立つかもしれませんが、実用的な観点からは、まったく役に立ちません。
2 番目の補遺
開始する場所は、標準です。C++03 と C++11 はどちらも次is_exact
のように定義します。
型が正確な表現を使用する場合は true。
それはあいまいであり、循環的でもあります。無意味です。char
整数型 ( 、short
、int
、long
など) が fiat によって「正確」であることはそれほど無意味ではありません。
すべての整数型は正確です...
他の算術型はどうですか?最初に注意すべきことは、他の算術型は浮動小数点型float
、double
、およびlong double
(3.9.1/8) のみであるということです。
float
、double
、およびの 3 つの浮動小数点型がありlong double
ます。... 浮動小数点型の値表現は実装定義です。整数型と浮動小数点型をまとめて算術型と呼びます。
C++ における浮動小数点型の意味は、非常にあいまいです。Fortran と比較します。
実数データは、実数の値に対するプロセッサの近似値です。
ISO/IEC 10967-1、言語に依存しない算術演算 (C++ 標準では脚注で参照されていますが、規範的な参照としては決して参照されていません) と比較してください。
浮動小数点型Fは、ℝ の有限部分集合でなければなりません。
一方、C++ は、浮動小数点型が何を表すと想定されているかに関しては議論の余地があります。私が知る限り、実装はのシノニム、のシノニム、のfloat
シノニムを作成することでうまくいく可能性があります。int
double
long
long double
long long
上の標準からもう一度is_exact
:
...しかし、すべての正確な型が整数であるとは限りません。たとえば、有理数と固定指数の表現は正確ですが、整数ではありません。
これは明らかに、ユーザーが定義することを許可されていないという単純な理由から、ユーザーが開発した拡張には適用されませんstd::whatever<MyType>
。それを行うと、未定義の動作が呼び出されます。この最後の節は、次の実装にのみ関係します。
float
、double
、およびを特定の方法で定義するlong double
か、または
std::numeric_limits<non_standard_type>
非標準の有理数型または固定小数点型を算術型として提供し、これらの非標準拡張に を提供することを決定します。