我想熟悉并熟悉浮点数。我正在做一个项目,希望通过在C ++中创建动态分配的,任意大小的浮点数来帮助我实现这一目标。我已经查看了标准浮点定义的IEEE-754规范,但我找不到它们之间的共同关联(我在32,64和{{使用了维基百科中的引用3}}位浮点数)。所以我的问题是:浮点数之间是否存在可以应用于任意大小的浮点数的公共模式?
如果没有,从编程的角度来看,定义我自己的具有模式的浮点表示会更容易吗?
编辑:按模式我的意思是尾数和指数中的位。
答案 0 :(得分:3)
2008版IEEE754定义宽度大于128位的交换格式应采用通用方法。
对于二进制格式,全宽k
应为32位的倍数,指数字段位数应为round(4 * log2 (k)) – 13
。可以确定该公式还给出了64位和128位格式的正确值,但不适用于16位或32位格式(它们的指数更宽)。
对于十进制格式,全宽k
应为32位的倍数,组合字段位数应为k / 16 + 9
。这也给出了32位,64位和128位格式的实际数字。
格式和操作的所有其他属性应保持不变,包括有效数解释,指数偏差和解释,目标舍入等。如果你
找不到它们之间的共同关联
在定义字段宽度时,您可能会因缺乏可见逻辑而感到困惑。是的,它们是经验性的,即更多地适应数量处理方面的积累经验以及将更多数据放入小房间的要求,而不是通用逻辑。
另一方面,您不限于这些标准限制。此外,一旦IEEE主要针对硬件设计并且IEEE754标准设计为易于实现硬连线,您不需要遵循其限制并且可以利用任何软件实现(如GMP
或MPFR
) 。软件实现的优势在于没有花时间来解包数字以进行计算并将其打包回来。
答案 1 :(得分:2)
IEEE-754二进制类型指定指数位宽,如下所示。
FP bit size Expo bit size
16 5
32 8
64 11
128 15
256 19
该类型的其余部分使用1个符号位和signifcand。
每this good answer @Netch,指数位宽为round(4 * log2 (k)) – 13
,为32和以上的倍数。
empirical answer到“浮点数之间是否存在可应用于任意大小的浮点数的公共模式?”可以使用以下内容保持与现有IEEE-754标准的相关性,并扩展到其他位大小fp_size >= 8
(或>= 6
如果你想推送它。)
int expo_width(int fp_size) {
return lrint(fp_size >= 32 ? 4*log2(fp_size)-13, 3*log2(fp_size)-7);
}
答案 2 :(得分:1)
有效数字 1 或指数中的位数没有强制数学规则。 IEEE 754-2008确实显示了一个描述其列出的特定大小的交换格式的公式,但这是一个非规范性的说明:
该公式不适用于16位或32位;它仅被认为保持64位和宽度为32的倍数大于或等于128(因此不是宽度32或96)。我想你可以认为它是一个更大尺寸的建议,但它没有约束力。
据我所知,IEEE 754-2008第3.6条表3.5中规定的参数来自惊人的平衡和历史用法。您可以使用第3.7节中描述的其他参数定义格式。 3.7给出了一些建议,用于使用精度参数(有效数字中的数字)和最大指数或仅精度来定义扩展精度。或者您可以忽略IEEE 754并定义自己的格式。标准不是强制性的,您的设计应该是目标的功能。
1 “有效”是浮点数的小数部分的首选术语。 “尾数”是对数的小数部分的术语。重要性是线性的(如果数字增加1.2倍,有效数增加1.2倍,除非超过指数阈值),尾数是对数的。