Binary IEEE 754规范中的十进制转换范围(二进制浮点算法)

Binary IEEE 754规范中的十进制转换范围(二进制浮点算法),binary,floating-point,ieee-754,Binary,Floating Point,Ieee 754,第11页底部第5.6节中的表2列出了必须执行十进制到二进制浮点转换的十进制值范围。指数的范围对我来说没有意义。例如,对于双精度,表中表示可转换的最大十进制值为(1017-1)*10999。这比DBL_MAX大得多,大约是1.8*10308。很明显,我遗漏了一些东西——有人能给我解释一下这张桌子吗?谢谢。[旁注:从技术上讲,您链接到的文档不再是标准;“IEEE 754”实际上只应用于引用2008年发布的标准的更新版本。] 我的理解是,正如您所说,该表的左栏描述了提供的任何十进制字符串到二进制浮点转

第11页底部第5.6节中的表2列出了必须执行十进制到二进制浮点转换的十进制值范围。指数的范围对我来说没有意义。例如,对于双精度,表中表示可转换的最大十进制值为(1017-1)*10999。这比DBL_MAX大得多,大约是1.8*10308。很明显,我遗漏了一些东西——有人能给我解释一下这张桌子吗?谢谢。

[旁注:从技术上讲,您链接到的文档不再是标准;“IEEE 754”实际上只应用于引用2008年发布的标准的更新版本。]

我的理解是,正如您所说,该表的左栏描述了提供的任何十进制字符串到二进制浮点转换的有效输入范围。例如,一个类似于
'1.234e+879'
的十进制字符串表示值1234*10^876(M=1234,N=876),因此在表限制范围内,需要被转换功能接受。但请注意,允许十进制字符串的确切形式不在IEEE 754的范围之内;这只是与此相关的值

我不认为一些允许的输入可能超出双精度的可表示范围是一个问题;在这种情况下,应遵循溢出的一般规则;见本文件第7.3节。也就是说,应该通知溢出异常,并且假设它没有被捕获,如果舍入模式是四舍五入到最近值或四舍五入到正无穷大,则转换的结果(例如,对于正超出范围的值)为正无穷大,如果舍入模式是朝负无穷大舍入或朝零舍入,则为最大有限表示值

更微妙的是,从我对本文档的阅读来看,转换函数也应该接受像“1e+1000”这样的十进制字符串,因为它所表示的值可以用10*10^999,甚至100000000000000*10^984的形式表示。参见第5.6节中以“输入时,尾随零应附加到M…”开头的句子


从公开的草案版本()来看,IEEE 754的当前版本在这方面似乎有点不同:它只要求每个实现在十进制字符串的指数上指定界限[-η,η],η大到足以容纳与支持的最大二进制格式的有限二进制值对应的十进制字符串;因此,如果binary64格式是受支持的最大格式,那么在我看来η=400就足够大了,例如。

好的,所以至少我读表时没有犯错误。这些指数限制似乎是任意的——如果规范给出了基本原理,那就更好了。为什么不是9999或99999?或者更好,更接近最大指数?很难想象用户希望文字1.234e879舍入到无穷大,而不是得到一个错误。VisualC++和java都给这个例子“常数太大”(Python,不奇怪,给出了INF):我想这个想法是,一个实现可以安全地限制它在这里进行处理,马克,但是我想你在答案中有了要点。我会想一想,看看我是否能提供进一步的见解。我在Jerome Coonen的《浮点算术拟议标准的实施指南》(a Implementation Guide to a Proposed Standard for Floating Point算术)中找到了一些东西:():在第79页的第2.21节中,它说“双精度:高达3位数的指数…”这不是允许如此高的指数max的理由,但至少它似乎证实了你的猜测。指数的范围是不对称的,这也很奇怪。如果规范化表达式M*10^N,则最大正N大于最大负N(绝对值)。