这可能是个很愚蠢的问题,但我已经找了一天了,却找不到答案.
假设我有一个双精度浮点文字:5.21。在Java中调用Double.toString( 5.21 )将产生字符串"5.21"。
现在,假设我们有Java,但是没有toString和valueOf,我也不能用String.format或仅仅通过连接来格式化它。假设我只有二进制表示,我如何能够将我的数字转换成一个字符串?
更具体地说,Double.toString和dtoa究竟是如何工作的:我如何编写自己的toString/dtoa函数(假设我们处理的是IEEE754双精度浮点数)?
发布于 2019-12-01 21:15:33
这是一个令人惊讶的棘手问题,尤其是如何高效、准确地完成任务。有两个主要问题:
。
因此,就像任何浮点一样,兔子洞也会深入,即使是像这样听起来无害的问题。在上述意义上,一个好的算法是正确的和最优的;这使得设计一个同样有效的算法变得困难。
但你很幸运。这也是一个研究得很好的问题:
https://www.cs.indiana.edu/~dyb/pubs/FP-Printing-PLDI96.pdf
令人惊讶的是,上面的第一篇和最后一篇论文相隔20年,证明了问题的难度。如果你想出一个更好的技术,这肯定是一个可发表的结果。享受吧!
发布于 2019-12-05 15:00:45
如何编写自己的toString/dtoa函数(?)
每个有限二进制浮点数都有一个精确的十进制表示。假设每个浮点数是2的各种幂之和,2的每一次幂以小数表示:例如: 256,2,0.25,0.0625。
Function to print a double - exactly通过仔细提取浮点的意义作为一个整数和指数来转换。然后,这是一个简单的情况循环和*2或/2的需要。这提供了一个确切的答案。
通常,一个圆形的结果是可以接受的。这变得更加复杂,但速度更快。
https://stackoverflow.com/questions/59129372
复制相似问题