【发布时间】:2015-05-23 06:02:31
【问题描述】:
我必须用C 重新实现printf(3),而不使用任何可以为我进行转换的函数。
我快完成了,我只需要%a,感谢你们,它也快完成了:How %a conversion work in printf statement?
男人说:
双参数被四舍五入并转换为十六进制表示法 在 style[-]0xh.hhhp[+-]d 中,后面的位数 十六进制点字符等于精度规范。
所以我的问题是四舍五入 如何?
我找到了:printf rounding behavior for doubles
它解释了 printf 正在使用 banker round 或 Round half to even 但我不知道如何实现它我已经尝试过:
a_double = round(a_double * pow(10, precision)) / pow(10, precision)
但在1000000 测试中,从0.000001 开始,每次失败时添加0.000001 405201 次,例如0.000011:
printf("%.6a", 0.000011) => 0x1.711948p-17
myprintf("%.6a", 0.000011) => 0x1.711947p-17
四舍五入“失败”,我没有得到与真正的 printf 相同的值。
我不认为将double 转换为hexa notation 的算法是错误的,因为精度为13 我绝对没有错误。
所以我只想知道如何我可以像 printf 对 double 所做的一样进行舍入。
【问题讨论】:
-
如果你需要在普通的二进制浮点机器上做这个,
"%a"不需要四舍五入 -
我怀疑这个问题是“从 0.000001 开始,每次添加 0.000001”而不是
myprintf()。 “加0.000001”和myprintf()有什么关系?请记住,0.000001不是 完全0.000001具有二进制浮点数。发布更多代码,展示您是如何生成测试编号的,以及为什么您认为您得到的结果不正确。 -
我从
0.000001开始,每次都加上0.000001,然后我比较官方printf的结果和我的,我的错了,因为我不知道printf是如何四舍五入的.此外,当精度为 >=13时,我绝对没有错误,因为没有发生舍入。