繁体   English   中英

当最后一个十进制不是5时,如何从二进制转换为IEEE754?

[英]How do you convert from binary to IEEE754 when the last decimal isn't 5?

我所能找到的所有内容都是简单地乘以2直到小数变为零,但这仅在最后一个小数为5时才有效。

在我的特殊情况下,要转换的数字是98765.4321,我如何将其(或任何其他无法解析的小数)转换为IEEE754?

我将假设问题如下:我们给了一个指定为十进制数字序列的数字,该数字可能包含小数,并可能使用科学计数法。 我们如何正确地将此数字转换为IEEE 754浮点标准指定的二进制浮点格式之一,即, binary16 (半精度), binary32 (单精度), binary64 (双精度)或binary128 (四精度) )?

如您所述,大多数十进制数字不能完全以二进制浮点格式表示。 这意味着我们需要选择一种IEEE-754舍入模式用于确定最终结果:朝正无穷大(“向上”)舍入,朝负无穷大(“向下”)舍入,向零舍入(截断) ,或朝着最近或偶数(“最近”)取整。 十进制到二进制的转换通常使用列出的最后一个模式,朝着最近或偶数取整,因为这样可以最大程度地减少转换中的总体误差。

从概念上讲,我们的任务很简单。 进行转换过程,直到我们生成足够的位以做出正确的舍入决策为止。 显然,我们经常需要比目标格式提供的位数更多的位。 但是,我们无法准确地告诉a-priory我们需要多少位,因为一些难以取舍的情况将产生非常接近平局的结果。 要注意的是,我们算法的某些部分将需要使用某种扩展的精度(或多精度)算法,并且我们需要开发一个标准来确定何时我们生成了足够的位以进行正确的舍入。

正确转换的基本算法是在过去一个世纪的几十年中开发的,并在以下出版物中进行了介绍:

David W. Matula,“内外转换”。 通信ACM ,卷。 11,No.1(1968年1月),第47-50页

David W. Matula,“浮点数值基数转换的形式化”。 IEEE Transactions on Computers ,第10卷,第8号(1970年8月),第681-692页( 在线

威廉·克林格(William D. Clinger),“如何准确读取浮点数”。 SIGPLAN通告 ,卷。 25,No.6(1990年6月),第92-101页( 在线

David M. Gay,“正确舍入二进制十进制和十进制二进制转换”。 技术报告90--10,AT&T贝尔实验室,1990年11月。( 在线

以下出版物对本研究领域进行了重新审视:

Michel Hack,“关于正确舍入十进制到二进制浮点转换所需的中间精度”。 实数与计算机学报(RNC'6) ,2004年11月,第113-133页( 在线

Aubrey Jaffer,“轻松准确地读取和写入浮点数”。 arXiv:1310.8121,草案v6(2015年1月),( 在线

尽管基本算法已经问世了25年,但是它们却具有相当大的复杂性,“细节决定成败”。 十进制到二进制转换的正确实现仍然难以捉摸。 在过去的5年中,Rick Regan的博客“ Exploring Binary”已经记录了广泛使用的软件(如Microsoft Visual C / C ++glibcPHP)的十进制到二进制转换功能中的许多缺陷,最后一项会导致无限循环,可能被利用来进行拒绝服务攻击。

Vern Paxson和William Kahan的论文解决了十进制到二进制转换中难以舍入的情况,并提供了一些示例来说明正确舍入可能需要超出目标精度的额外位数:

V. Paxson和W. Kahan,“用于测试IEEE十进制-二进制转换的程序”。 原稿,1991年5月( 在线

附加难圆的情况下为IEEE-754 binary64在1996年被列入张贴到新闻组comp.arch.arithmetic由Fred Tydeman。

以下论文描述了用于测试转换的测试框架,但是包含测试向量的文件在我上次检查时不再可以在线访问:

Brigitte Verdonk,Annie Cuyt和Dennis Verschaeren。 “用于测试浮点运算II:转换的与精度和范围无关的工具。” ACM Transactions on Mathematical Software ,第一卷。 27,No.1(2001年3月),第119-140页。 在线草稿

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM