![]() |
1
6
经典的实现是david gay的
(作为旁注……并不是所有这些gay的dtoa代码副本都是最新的,所以因为php使用了 古老的 解析2.2250738585072011E-308时,strtod的版本挂起。) 一般来说,如果你做一些“明显的”简单的事情,比如乘以10的幂,然后转换整数,你会损失少量的精度,一些结果会不准确……但也许你会得到正确的前14或15位数字。gay对dtoa()的实现声称要更正所有数字…但结果,代码很难遵循。跳到底部查看strtod本身,您可以看到它从一个“快速路径”开始,它只使用普通的浮点运算,但随后它会检测结果是否不正确,并使用一个更可靠的算法,该算法使用bigints,在所有情况下都有效(但速度较慢)。 该实现包含以下引文,您可能会发现这些引文很有趣: * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. 该算法通过计算产生给定二进制数的十进制数的范围来工作,并且通过使用更多的数字,范围会越来越小,直到您得到准确的结果或者您可以正确地舍入到所请求的位数为止。 特别是,根据SEC 2.2算法,
然后,该算法可以继续,直到得到精确的结果(这是始终可能的,因为浮点数是基数2,2是10的一个因数),或者直到它有尽可能多的数字。本文进一步证明了算法的正确性。
还请注意,并非所有的
|
![]() |
2
2
有多种方法可以将浮点数无误地转换为十进制数(精确地转换或舍入到所需的精度)。
一种方法是用小学教的算术。c提供处理浮点数的函数,例如
商业
如何做到这一点的关键是
注意,问题的第一步,x乘以10的幂,已经有两个舍入误差。首先,并非所有的10次方都可以用二进制浮点表示,所以仅仅生成这样的10次方必然会有一些表示错误。然后,乘以
|
![]() |
3
1
无论是C还是C++标准都没有为这种情况指定特定的算法。因此不可能回答
如果你想知道
一个例子
一个
|
|
Rik Bloemers · for循环不接受任何浮点变量 3 年前 |
![]() |
zell · 为什么存储7个浮点数需要34字节? 3 年前 |
![]() |
Atharva Sunil Sathe · 如何删除任意数的小数点? 3 年前 |
![]() |
user1658887 · 为什么**2!=a*a一些彩车? 7 年前 |