如何知道我的编译器如何编码浮点数据? 如何知道浮点数据在C++程序中的存储方式? 例如,如果我将数字1.23分配给一个double对象,我如何知道这个数字是如何编码的?
编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码) 设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容如何知道我的编译器如何编码浮点数据? 如何知道浮点数据在C++程序中的存储方式? 例如,如果我将数字1.23分配给一个double对象,我如何知道这个数字是如何编码的?,c++,floating-point,C++,Floating Point,编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码) 设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容 IEEE 754标准相当普遍。编译器将使用您正在编译的CPU体系结构所使用的编码。(除非该体系结构不支持浮点,在这种情况下,编译器可能会选择使用模拟的编码) 设计CPU体系结构的供应商应记录其使用的CPU编码。通过阅读文档,您可以了解文档内容 P.> IEEE 754标准是相当普遍的
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++实现的特性的责任在于实现和实现者,因为没有其他方可以做到。它(也就是说,实现者创建了实现,他们可以以任意方式创建,因此他们是决定特征的人,因此他们是该信息的来源)
<>标准定义浮点类型的一些数学特征,需要实现在
关联此模型的参数:
提供基数bFLT_基数
、FLT\u MANT\u DIG
和DBL\u MANT\u DIG
分别为LDBL\u MANT\u DIG
、float
和double
类型提供有效位位数,也称为精度plong double
,FLT\u MIN\u EXP
,DBL\u MIN\u EXP
,LDBL\u MIN\u EXP
,FLT\u MAX\u EXP
提供最小和最大指数emin和emaxDBL\u MAX\u EXP
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进行编码。