1
38
c包含两个主要函数:dtoa()将double转换为string,strtod()将string转换为double。它还包含了大量的支持函数,其中大部分是为自己实现任意精度的算术。dtoa.c声称自己的名气是让这些转换正确,而这通常只能用任意精度的算术来完成。在四种不同的取整模式下,它还具有正确的代码取整转换。 您的代码只尝试实现等效的dtoa(),因为它使用浮点进行转换,所以并不总是正确的。(更新:参见我的文章 http://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/ 详情。 (我在博客上写了很多关于这个的文章, http://www.exploringbinary.com/ . 我最近七篇文章中有六篇是关于strtod()转换的。通读它们,看看正确地进行四舍五入转换有多复杂。) |
2
7
生产 好的 十进制和二进制浮点表示之间的转换结果是一个相当困难的问题。
困难的主要来源是许多小数,即使是简单的小数,也不能
准确地
用二进制浮点表示——例如,
所以,转换通常涉及近似。良好的转换程序保证生成 最近的 特定(字大小或位数)约束内的可能近似值。这就是大部分复杂性的来源。
看看评论中引用的文章
(此外,更一般地说: What Every Computer Scientist Should Know About Floating Point Arithmetic ) |
3
4
基于对它的快速浏览,相当数量的C版本正在处理多个平台,例如它看起来像是在编译器(C&AM+C++)、BITNESS、浮点实现和平台上一般可用的;
|
4
4
我还认为dtoa.c中的代码可能更有效(独立于语言)。例如,它似乎在做一些小动作,在专家的手中,这通常意味着速度。因为速度的原因,我假设它只是使用了一个不太直观的算法。 |
5
2
简短回答:因为
这正是调试良好的产品和NIH原型之间的区别。 |
Rik Bloemers · for循环不接受任何浮点变量 2 年前 |
zell · 为什么存储7个浮点数需要34字节? 2 年前 |
Atharva Sunil Sathe · 如何删除任意数的小数点? 2 年前 |
user1658887 · 为什么**2!=a*a一些彩车? 6 年前 |