首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制浮点数(IEEE 754)如何转换为十进制(即字符串)?

二进制浮点数(IEEE 754)如何转换为十进制(即字符串)?
EN

Stack Overflow用户
提问于 2019-12-01 19:52:23
回答 2查看 303关注 0票数 0

这可能是个很愚蠢的问题,但我已经找了一天了,却找不到答案.

假设我有一个双精度浮点文字:5.21。在Java中调用Double.toString( 5.21 )将产生字符串"5.21"

现在,假设我们有Java,但是没有toStringvalueOf,我也不能用String.format或仅仅通过连接来格式化它。假设我只有二进制表示,我如何能够将我的数字转换成一个字符串?

更具体地说,Double.toStringdtoa究竟是如何工作的:我如何编写自己的toString/dtoa函数(假设我们处理的是IEEE754双精度浮点数)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-01 21:15:33

这是一个令人惊讶的棘手问题,尤其是如何高效、准确地完成任务。有两个主要问题:

  1. 每一个二进制浮点表示围绕它的一组“实数”,这个间隔的大小取决于值本身。(一般来说,值越大,它所代表的间隔就越大。)“正确”转换通常定义为在这个集合中选择一个元素,其中包含许多十进制浮点数。对于“正确”的选择,
  2. 通常需要“最佳”输出,即具有最少小数位数的字符串。

因此,就像任何浮点一样,兔子洞也会深入,即使是像这样听起来无害的问题。在上述意义上,一个好的算法是正确的和最优的;这使得设计一个同样有效的算法变得困难。

但你很幸运。这也是一个研究得很好的问题:

https://www.cs.indiana.edu/~dyb/pubs/FP-Printing-PLDI96.pdf

  • A

令人惊讶的是,上面的第一篇和最后一篇论文相隔20年,证明了问题的难度。如果你想出一个更好的技术,这肯定是一个可发表的结果。享受吧!

票数 4
EN

Stack Overflow用户

发布于 2019-12-05 15:00:45

如何编写自己的toString/dtoa函数(?)

每个有限二进制浮点数都有一个精确的十进制表示。假设每个浮点数是2的各种幂之和,2的每一次幂以小数表示:例如: 256,2,0.25,0.0625。

Function to print a double - exactly通过仔细提取浮点的意义作为一个整数和指数来转换。然后,这是一个简单的情况循环和*2或/2的需要。这提供了一个确切的答案。

通常,一个圆形的结果是可以接受的。这变得更加复杂,但速度更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59129372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档