[all] calculations done on [this] type are free of rounding errors.
而IBM’s definition几乎总是如此(或者是循环定义,取决于你如何读取它)
a type that has exact representations for all its values
我确定的是,我可以在双重和长时间存储2,他们都将被正确地代表.
我可以把它们分成10,而且也不会完全符合数学结果.
给定任何数字数据类型T,定义std :: numeric_limits< T> :: is_exact的正确方法是什么?
编辑:
我从许多答案中提供的细节发布了what I think is an accurate answer这个问题. This answer is not a contender for the bounty.
解决方法
鉴于IEC浮点标准具有“不精确”数字的概念(以及当计算产生不准确数量时的不精确异常),我怀疑这是名称is_exact的起源.请注意,标准类型的is_exact对于float,double和long double是false.
意图是指示类型是否完全代表底层数学类型的所有数字.对于积分类型,底层数学类型是整数的一些有限子集.由于每个整数类型都精确地表示了该类型定位的整数子集的每一个成员,因此所有积分类型的is_exact都为真.对于浮点类型,底层数学类型是实数的一些有限范围子集. (有限范围子集的一个例子是“0和1之间的所有实数”).没有办法能够准确地表示真实的有限范围子集;几乎所有的都是不可计算的. IEC / IEEE格式使事情更糟.使用该格式,计算机甚至不能精确地表示有理数量的有限范围子集(更不用说可计算数的有限范围子集).
我怀疑这个术语的来源is_exact是各种浮点表示模型中“不精确”数字的长期概念.也许一个更好的名字将是is_complete.
附录
由语言定义的数字类型不是“数字”的全部和最终表示形式.固定点表示本质上是整数,所以它们也是精确的(表示中没有孔).将理性表示为一对标准积分类型(例如,int / int)将不是精确的,但是表示理性的Bignum对的类至少在理论上将是“精确的”.
真的怎么样?没有办法代表真正的原因,因为几乎所有的真实都不可计算.我们可以用电脑做的最好的是可计算的数字.这将需要将数字表示为一些算法.虽然这在理论上可能是有用的,但从实际的角度来看,这根本不是有用的.
第二附录
开始的地方是标准. C 03和C 11都将is_exact定义为
True if the type uses an exact representation.
这是模糊和循环的.没意义整数类型(char,short,int,long等)都不是完全没有意义的,而是由fiat“exact”
All integer types are exact,…
其他算术类型呢?首先要注意的是,唯一的其他算术类型是float,double和long double(3.9.1 / 8)的浮点类型:
There are three floating point types:
float
,double
,andlong double
. … The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types.
C中浮点类型的含义显然是阴暗的.与Fortran比较:
A real datum is a processor approximation to the value of a real number.
与ISO / IEC 10967-1进行比较,语言无关算术(C标准参考脚注,但从未作为规范性参考):
A floating point type F shall be a finite subset of ℝ.
另一方面,C对于浮点类型应该代表什么来说是微不足道的.据我所知,一个实现可能会让float成为int的同义词,长期以来长两倍的同义词.
再次来自is_exact的标准:
… but not all exact types are integer. For example,rational and fixed-exponent representations are exact but not integer.
这显然不适用于用户开发的扩展,因为用户不允许定义std :: whatever< MyType>的简单原因.这样做,你正在调用未定义的行为.这个最后一个条款只能涉及实现
>以某种特殊的方式定义float,double和long double,或者>提供一些非标准的理性或固定点类型作为算术类型,并决定提供一个std :: numeric_limits< non_standard_type>对于这些非标准扩展.