【发布时间】:2015-05-24 03:34:36
【问题描述】:
我必须用C 重新实现printf(3),而不使用任何可以为我进行转换的函数。
在我理解了感谢你们%a 是如何工作的之后,我以为我已经完成了:How %a conversion work in printf statement?
然后我意识到我不明白rounding是如何完成的,所以我问:C printf float rounding然后我认为在你帮助我之后我已经完成了。
现在%a 完全像官方的一样工作,我认为%La 会和%a 完全一样,但是long double 因为这个人只说:
修饰语 a, A, e, E, f, F, g, G
l (ell) double(忽略,与没有它的行为相同)
L长双
我发现它输出的东西完全不同:'(
double a_double = 0.0001;
long double a_long_double = 0.0001;
printf("%a\n", a_double); #=> 0x1.a36e2eb1c432dp-14
printf("%La\n", a_long_double); #=> 0xd.1b71758e21968p-17
%a 结果总是以1. 开头,现在我完全不明白%La 在做什么。
您能帮我理解将0.0001 转换为0xd.1b71758e21968p-17 的过程吗?
编辑:我真的不明白的部分是为什么 %a 总是输出以1. 而不是%La 开头的东西?
EDIT2:更准确地说:为什么%a 选择输出1. ...p-14 而%La 选择输出d. ...p-17?
【问题讨论】:
-
@Wintermute:但无论如何整个输出都是四舍五入的......打印的两个数字相同,但选择的指数不同。
-
@BillLynch 是的,正是我的问题!
-
@Wintermute:这两个数字之间没有区别(除了类型):如果您将一个表示移三位,您将得到另一个。
-
@BillLynch:您的观点是正确的,只是挑剔: %a 的真正目的是不对要输出的数字进行四舍五入!
-
@Wintermute:如果您不了解实际发生的情况,请不要告诉人们这是“浮点舍入错误”。这里没有舍入误差;事实上,格式中根本没有四舍五入。
标签: c hex printf type-conversion