C变量函数va_arg返回错误的双精度

时间:2015-03-23 20:29:49

标签: c printf variadic-functions

所以我差不多在printf(3)重新实现了C(我不能使用任何可以转换的功能)。

现在我已经实现了所有转化,我看到了一些奇怪的东西,当我通过我的函数double使用%g时,100.10然后va_arg给了我100.09999999999999,所以我的转换当然会给我一个100.099999的字符串。

我像这样取双:

double d = (double)(va_arg(args, double));

我正在调用这两个函数:

double testd = 100.10;
my_printf("%g", testd); #=> 100.099999
printf("%g", testd); #=> 100.1

认为知道该值是错误的,因为在逐步执行该程序时,我看到double d = 100.09999999999999

我应该采用不同的方式吗?因为真正的printf似乎得到了正确的值。

编辑:

printf("%#.10g\n", testd); #=> 100.1000000000

这是由于四舍五入还是真正的printf可能获得了良好的价值?

1 个答案:

答案 0 :(得分:3)

只需添加格式说明符,printf也许会显示相同的问题:

printf("%0.20g\n", d); // 100.09999999999999 on my system

原因是在我们的例子中,数字100.1(因为大多数数字)没有精确的二进制表示。