标准中的定义(见 NPE 的回答)不是很准确,是吗?相反,它是循环的和模糊的。
鉴于 IEC 浮点标准具有“不精确”数字的概念(以及计算产生不精确数字时的不精确异常),我怀疑这就是 name 的由来is_exact
。请注意,在标准类型中,is_exact
仅对float
、double
和为假long double
。
目的是表明该类型是否准确地表示了基础数学类型的所有数字。对于整数类型,基础数学类型是整数的某个有限子集。由于每个整数类型准确地表示该类型所针对的整数子集的每个成员,is_exact
对于所有整数类型都是如此。对于浮点类型,基础数学类型是实数的某个有限范围子集。(有限范围子集的一个示例是“0 到 1 之间的所有实数”。)甚至没有办法准确地表示实数的有限范围子集。几乎所有都是不可计算的。IEC/IEEE 格式使事情变得更糟。使用这种格式,计算机甚至不能精确地表示有理数的有限范围子集(更不用说可计算数的有限范围子集了)。
我怀疑该术语的起源is_exact
是各种浮点表示模型中“不精确”数字的长期概念。也许一个更好的名字会是is_complete
。
附录
语言定义的数字类型并不是“数字”表示的全部和全部。定点表示本质上是整数,因此它们也是精确的(表示中没有漏洞)。将有理数表示为一对标准整数类型(例如int/int
)并不精确,但是将有理数表示为一Bignum
对的类至少在理论上是“精确的”。
实物呢?没有办法准确地表示实数,因为几乎所有的实数都是不可计算的。我们可以用计算机做的最好的事情就是可计算的数字。这需要将一个数字表示为某种算法。虽然这在理论上可能有用,但从实践的角度来看,它根本没用。
第二个附录
开始的地方是标准。C++03 和 C++11 都定义is_exact
为
如果类型使用精确表示,则为真。
这既模糊又循环。这是没有意义的。并非完全没有意义的是整数类型(char
, short
, int
, long
, 等)对于法令来说是“精确的”:
所有整数类型都是精确的,...
其他算术类型呢?首先要注意的是,唯一的其他算术类型是浮点类型float
、double
和long double
(3.9.1/8):
共有三种浮点类型:float
、double
和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>
为这些非标准扩展提供一个。