我正在尝试打印花车。虽然可变参数函数不适用于浮点数,因此它们被提升为double。我可以通过将其强制转换为双重来摆脱警告。在某些powerpc架构上打印结果时,如果使用%f打印,则会给出不正确的值。为什么?
测试代码:
#include <stdio.h>
#define _echo_size(X) \
printf ("Sizeof "#X" %u\n", sizeof(X))
int main (void)
{
float x;
long usec = 7L;
_echo_size(float);
_echo_size(double);
_echo_size(short);
_echo_size(int);
_echo_size(long);
_echo_size(long long);
x = ((float) usec) / 2;
printf("Expected: 3.5 Got: %1.1f\n", (double) x);
printf("Expected: 3.5 Got: %1d.%.1d\n", (int)x,
(int)((x-(int)x)*10));
return 0;
}
Sizeof float 4
Sizeof double 8
Sizeof short 2
Sizeof int 4
Sizeof long 8
Sizeof long long 8
Expected: 3.5 Got: 3.5
Expected: 3.5 Got: 3.5
Sizeof float 4
Sizeof double 8
Sizeof short 2
Sizeof int 4
Sizeof long 4
Sizeof long long 8
Expected: 3.5 Got: 0.0 <--- Why this ?
Expected: 3.5 Got: 3.5
这是工具链中的错误吗?否则打印花车的优雅方式是什么?
答案 0 :(得分:1)
哦,杜!正确计算x
的浮点值,无论您的FPU是在执行此操作,还是编译器是在软件中为您执行此操作;只是您的printf()
实施显然不会将%f
视为double
......
您是否在具有自定义printf()
实施的嵌入式系统上?如果是这样的话,可能不会编写处理浮点数,因为浮点数通常甚至不用于嵌入式系统,其中程序员经常选择使用整数变量&amp;定点算术,历史上比浮点快得多(并且可能仍然在小型嵌入式系统上)。
或者,另一种可能性:您的自定义printf()
是,用于处理浮点数,但将%f
视为float
,即使您的编译器提升通过float
传递时double
到...
。找到您的自定义实现&amp;修复它以%f
而不是double
从堆栈中拉出float
。 (您的自定义实现可能会通过尝试执行此操作而发出警告,人们可能忽略了这一点。)在该代码中搜索va_arg(args,float)
并将其更改为va_arg(args,double)
。 (当然,该示例中的args
是我自己的va_list
变量名;您的变量名可能不同。)