Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道我的编译器如何编码浮点数据? 如何知道浮点数据在C++程序中的存储方式? 例如,如果我将数字1.23分配给一个double对象,我如何知道这个数字是如何编码的?_C++_Floating Point - Fatal编程技术网

如何知道我的编译器如何编码浮点数据? 如何知道浮点数据在C++程序中的存储方式? 例如,如果我将数字1.23分配给一个double对象,我如何知道这个数字是如何编码的?

如何知道我的编译器如何编码浮点数据? 如何知道浮点数据在C++程序中的存储方式? 例如,如果我将数字1.23分配给一个double对象,我如何知道这个数字是如何编码的?,c++,floating-point,C++,Floating Point,编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码) 设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容 IEEE 754标准相当普遍。编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码) 设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容 P.> IEEE 754标准是相当普遍的

编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码)

设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容


IEEE 754标准相当普遍。

编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码)

设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容


<> P.> IEEE 754标准是相当普遍的。< / P> < P>了解浮点数据被编码的官方方法是读取C++实现的文档,因为2017 C++标准说,在6. 91.“基本类型”[Basic .Basic ],第8段,草案N469:

…浮点类型的值表示是由实现定义的

“实施定义”是指实施必须对其进行记录(3.12“实施定义行为”[defns.impl.defined])

C++标准在这方面似乎不完整,因为它表示“……值表示是表示值的对象表示中的一组位”…(6.9个类型[Basic,类型] 4)“类型为

T
的对象的对象表示是类型为
T
的对象所使用的N个
无符号字符
对象的序列,…”(同上)但我不认为它表示实现必须定义对象表示中的哪些位是值表示,或者在哪个顺序/映射中。然而,通知C++实现的特性的责任在于实现和实现者,因为没有其他方可以做到。它(也就是说,实现者创建了实现,他们可以以任意方式创建,因此他们是决定特征的人,因此他们是该信息的来源)

<>标准定义浮点类型的一些数学特征,需要实现在 <代码>中描述它们。C++继承了这些代码在<代码> <代码>(C++ 20.5.1.2)标题[[Heals] 3-4)] C 2011 5.2.4.2.2“浮动类型的特性<代码> <代码> >定义浮点数x等于sbe和(fkb)的模型−k表示k=1到p),其中s是符号(±1),b是基或基数,e是emin和emax之间的指数,p是精度(有效位中的基-b位数),fk是有效位的基-b位数(小于b的非负整数)。浮点类型还可以包含无穷大和非a数(NaN)“值”,并将某些值区分为正常值或次正常值。然后
关联此模型的参数:

  • FLT_基数
    提供基数b
  • FLT\u MANT\u DIG
    DBL\u MANT\u DIG
    LDBL\u MANT\u DIG
    分别为
    float
    double
    long double
    类型提供有效位位数,也称为精度p
  • FLT\u MIN\u EXP
    DBL\u MIN\u EXP
    LDBL\u MIN\u EXP
    FLT\u MAX\u EXP
    DBL\u MAX\u EXP
    提供最小和最大指数emin和emax
<除了在<代码> <代码>中提供这些之外,C++还提供了在<代码> <代码> >标题(21.3.4.1)中定义的模板(21.3.4.1)数值限制成员(“数字,限制成员”)在<代码> Rexx < /Cuff>(b),<代码>数字> /COD>(p),<代码> min指数> /Eng>(< Emin)和<代码>最大指数< /代码>(EMAX)。例如,
std::numeric_limits::digits
给出了
double
类型有效位中的位数。该模板包括描述浮点类型的其他成员,例如它是否支持无穷大、NaN和次正常值

这些提供了浮点格式的数学属性的完整描述。但是,如上所述,C++似乎不能指定实现应该记录代表类型的值位如何出现在对象位中。

许多C++实现使用IEEE-75 4基本二进制格式,用于<代码>浮点< /C> > 64位格式>代码>双< /C> >,将值位映射到对象位,与相应宽度的整数相同。如果是,对于正常数,符号S以最高有效位编码(0或1为+1或−在接下来的8(

float
)或11(
double
)中,使用偏置值e+126(
float
)或e+1022(
double
)对指数e进行编码位,其余位包含从2到p的k的数字fk。对于正常数字,第一位数字f1为1。对于次正常数字,指数字段为零,f1为0。(注意,此处的偏差为126和1022,而不是IEEE-754中使用的127和1023,因为C模型使用b表示有效位−k代替b1−k as在IEEE-754中使用。)无穷大用指数字段中的所有1和有效位字段中的所有0进行编码。NaN用指数字段中的所有1而不是有效位字段中的所有0进行编码。