我试图在不使用浮点指令的情况下将两个浮点数相乘。一切都进行得很顺利,直到我遇到了非正态化的数字。我如何知道我是应该正常化还是去修饰产品?这种不确定性使得对产品的包围变得很困难。我的直觉告诉我,如果这两个因素都是非正态数,那么这个乘积应该是非正态化的。
发布于 2020-07-12 11:54:12
低于正常值的数非常接近于零。对于一个次正规的x,x^2有大约一半的无偏指数,而且它太小了,甚至连一个亚正规都不能表示。(即使x是最大的亚正常值,即nextafter(FLT_MIN, -INF)。对于任何两个亚正常数,情况都是相似的。
是两个次正规数的乘积,它总是完全潜入+或-0.0.。
如果可能的话,任何操作的结果都应该是标准化的。唯一不可能的情况是,当指数太小时,你就会得到低于正常的(也称为正态)的数字,让尾数的前导位为零,得到最小的指数值。格式化一般很好地解释了低于正常值的数字。
--这是浮点的一般规则,总是: IEEE754格式,如binary32和binary64,在如何表示给定的有限值时没有选择余地。-非零指数编码意味着尾数中的前导1,因此,除了低于正常值之外,不可能有去规范的float或double。x87 80位扩展精度格式显式地存储了它的尾数位,所以可以用非零指数但尾数中的前导零对数字进行编码。然而,硬件甚至可能认为这是无效的,您绝对不应该这样做,因为这意味着丢弃更多的尾数比特,而不是必要的(如果这是乘法的话)。
如果符号不同/匹配,加法或减法也会产生低于正常值的数字。例如,nextafter(FLT_MIN, +INFINITY) - FLT_MIN取消了除最低尾数(“灾难性取消”的一个例子)以外的所有尾数,留下的数字太小,无法表示为规范化浮点数。
https://stackoverflow.com/questions/62860563
复制相似问题