[英]C variadic functions va_arg returns wrong double precision
所以我几乎做了重新实现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
可能获得了良好的价值?
只需添加格式说明符, printf
可能会显示相同的问题:
printf("%0.20g\n", d); // 100.09999999999999 on my system
原因是在我们的例子中,数字100.1
(大多数数字)没有精确的二进制表示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.