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
(大多数数字)没有精确的二进制表示。
所以我几乎完成了在 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
(大多数数字)没有精确的二进制表示。