8

我正在尝试打印花车。尽管可变参数函数不适用于浮点数,但它们被提升为双精度值。我可以通过将其转换为双倍来设法摆脱警告。在某些 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;
}

X86系统结果:

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

ppc系统结果:

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

它是工具链中的错误吗?否则打印花车的优雅方式是什么?

4

2 回答 2

1

哦,呃!无论您的 FPU 是否正在执行此操作,或者您的编译器是否在软件中为您执行此操作,您的浮点值x 都会被正确计算;只是您的printf()实现显然不被%f视为double...

您是否在使用自定义实现的嵌入式系统上printf()?如果是这样,它可能无论如何都不是为了处理浮点数而编写的,因为浮点数通常甚至不用于嵌入式系统,程序员经常选择使用整数变量和定点算术,这在历史上要快得多浮点(并且可能仍然在小型嵌入式系统上)。

或者,另一种可能性:您的自定义printf() 为处理浮点数而编写的,但将%f其视为float,即使您的编译器在传递它时将其提升float为. 找到您的自定义实现并修复它以将堆栈作为 a而不是. (您的自定义实现可能会因为尝试这样做而收到警告,人们可能只是忽略了这一点。)在该代码中搜索并将其更改为. (当然在那个例子中是我自己的变量名 a ;你的变量名可能不同。)double...%fdoublefloatva_arg(args,float)va_arg(args,double)argsva_list

于 2013-01-31T21:58:27.203 回答
-3

我想这都是关于“大端”和“小端”的

于 2013-01-15T14:28:17.600 回答