理论上,每个普通单曲都可以填充指数和尾数以创建双精度,然后删除填充,然后返回原始单曲。
当你从理论走向现实时,你就会遇到问题。我不知道您是否对理论或实现感兴趣。如果是实施,那么您很快就会遇到麻烦。
IEEE 是一种可怕的格式,我的理解是,它被故意设计得如此艰难,以至于没有人能够满足它,并让市场赶上英特尔(这是不久前的),从而允许更多的竞争。如果这是真的,它失败了,无论哪种方式,我们都被这个可怕的规范所困扰。像 TI 格式这样的东西在很多方面都比现实世界优越得多。我与任何一家公司或任何这些格式都没有联系。
多亏了这个规范,实际上满足它的 fpus 很少(在硬件中,甚至在硬件和操作系统中),而且那些在下一代经常失败的 fpus。(谷歌:TestFloat)。这些天的问题往往在于 int 浮动和浮动到 int,而不是像您上面指定的那样单到双和双到单。当然,fpu 将执行什么操作来进行转换?加0?乘以 1?取决于 fpu 和编译器。
与上述问题相关的 IEEE 的问题是,数字的方式不止一种,不是每个数字都可以表示,而是可以表示许多数字。如果我想破坏您的代码,我将从负零开始,希望两个操作之一将其转换为正零。然后我会尝试非规范化。它应该失败并带有信号 nan,但是您将其称为已知异常。
问题是等号,这里是关于浮点的第一条规则,永远不要使用等号。等于是位比较而不是值比较,如果您有两个以不同方式表示的值(例如加零和负零),即使它的数字相同,位比较也会失败。大于和小于在 fpu 中完成,等于在整数 alu 中完成。
我意识到您可能使用等于来解释问题,而不一定是您想要成功或失败的代码。