C++ 标准::数值限制::是否精确。。。什么是可用的定义?

C++ 标准::数值限制::是否精确。。。什么是可用的定义?,c++,numeric-limits,C++,Numeric Limits,正如我所理解的那样,numeric\u limits::is\u exact几乎总是错误的: 对[此]类型进行的[所有]计算均无舍入误差 这几乎总是正确的:(或循环定义,取决于你的阅读方式) 对其所有值都有精确表示的类型 我可以肯定的是,我可以将2存储在double和long中,它们都会被精确地表示出来 然后我可以把它们都除以10,两者都不能精确地保存数学结果 给定任何数值数据类型T,定义std::numeric\u limits::is\u精确的正确方法是什么? 编辑: 我已经根据许多答案中提

正如我所理解的那样,
numeric\u limits::is\u exact
几乎总是错误的:

对[此]类型进行的[所有]计算均无舍入误差

这几乎总是正确的:(或循环定义,取决于你的阅读方式)

对其所有值都有精确表示的类型

我可以肯定的是,我可以将
2
存储在
double
long
中,它们都会被精确地表示出来

然后我可以把它们都除以
10
,两者都不能精确地保存数学结果

给定任何数值数据类型
T
,定义
std::numeric\u limits::is\u精确的正确方法是什么?

编辑:
我已经根据许多答案中提供的详细信息发布了这个问题
static constexpr bool是精确的

如果类型使用精确表示,则为True。所有整数类型都是精确的,但并非所有的精确类型都是精确的 整数。例如,有理和固定指数表示是精确的,但不是整数

对所有专业都有意义


标准中的定义(见NPE的答案)不是很准确,是吗?相反,它是循环和模糊的

考虑到IEC浮点标准有一个“不精确”数字的概念(当计算产生一个不精确的数字时有一个不精确的例外),我怀疑这就是名称的起源。请注意,在标准类型中,
是精确的
仅在
浮点
双精度
长双精度
时为假

其目的是指示类型是否准确地表示基础数学类型的所有数字。对于整数类型,基本的数学类型是整数的某个有限子集。由于每个整数类型都精确地表示该类型所针对的整数子集的每个成员,
是精确的
适用于所有整数类型。对于浮点类型,基本的数学类型是实数的某个有限范围子集。(有限范围子集的一个例子是“0到1之间的所有实数”。)即使是实数的有限范围子集也无法精确表示;几乎所有的都是不可计算的。IEC/IEEE格式让事情变得更糟。使用这种格式,计算机甚至不能精确地表示有理数的有限范围子集(更不用说可计算数的有限范围子集)

我怀疑术语
的起源是精确的
是各种浮点表示模型中长期存在的“不精确”数字概念。也许更好的名字应该是
is\u complete

附录
该语言定义的数字类型不是“数字”的全部和全部表示形式。定点表示法本质上是整数,因此它们也是精确的(表示法中没有孔)。将有理数表示为一对标准整数类型(例如,
int/int
)并不精确,但将有理数表示为
Bignum
对的类至少在理论上是“精确”的

那雷亚尔呢?因为几乎所有的实数都是不可计算的,所以无法精确地表示实数。我们能用计算机做的最好的事情就是计算数字。这需要将一个数字表示为某种算法。虽然这在理论上是有用的,但从实践的角度来看,它一点用处都没有

第二附录
从标准开始。C++03和C++11都将
定义为

如果类型使用精确表示,则为True

这既模糊又循环。这毫无意义。整数类型(
char
short
int
long
,等等)按法令是“精确的”,这并不是毫无意义的:

所有整数类型都是精确的

其他算术类型呢?首先要注意的是,唯一的其他算术类型是浮点类型
float
double
long double
(3.9.1/8):

有三种浮点类型:
float
double
longdouble
。。。浮点类型的值表示由实现定义。整型和浮点型统称为算术型

<> C++中浮点类型的含义明显模糊。与Fortran相比:

实数数据是处理器对实数值的近似值

与ISO/IEC 10967—1语言无关的算法(其中C++标准引用脚注,但从未作为规范参考):

浮点类型F应为ℝ.

另一方面,关于浮点类型应该表示什么,C++还没有定论。据我所知,实现可以使
float
成为
int
的同义词,
double
成为
long
的同义词,
long double
成为
long
的同义词

再次从
上的标准来看,它是精确的

。。。但并非所有的确切类型都是整数。例如,有理数和固定指数表示是精确的,但不是整数

这显然不适用于用户开发的扩展,原因很简单,即不允许用户定义
std::whatever
。这样做,您将调用未定义的行为。最后一个条款只适用于以下实现:

  • 在某些特殊情况下定义
    float
    double
    long double
    If there exists any pair of values (a,b) of a type such that a+b-a-b != 0,
    then this type is inexact (in the sense that + operation is inexact).
    
    If there exists any pair (a,b) such that (a+b) is well defined
    and a+b-a-b != 0,
    then the + operation is inexact.