C 可变参数函数 va_arg returns 错误的双精度

C variadic functions va_arg returns wrong double precision

所以我几乎完成了在 C.

中重新实现 printf(3)(我不能使用任何可以为我转换的函数)

现在我已经实现了所有的转换,我看到了一些奇怪的东西,当我传递我的函数 a double 与 say %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 获得了好的价值?

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

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

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