繁体   English   中英

打印浮标。 (Powerpc)

[英]Printing floats. (Powerpc)

我正在尝试打印花车。 尽管可变参数函数不适用于浮点数,但它们被提升为两倍。 我可以通过将警告转换为两倍来消除警告。 在某些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

这是工具链中的错误吗? 否则,打印浮标的优雅方法是什么?

哦,! 为您的浮点值x 正确计算的,不管你的FPU是否是做什么的,或者如果你的编译器做你的软件; 只是您的printf()实现显然没有将%f视为double ...

您是否在具有自定义printf()实现的嵌入式系统上? 如果是这样,则可能根本不会编写处理浮点数的方法,因为浮点数通常甚至不用于嵌入式系统,在嵌入式系统中,程序员经常选择使用整数变量和定点算法,这在历史上比浮点数(可能仍在小型嵌入式系统上)。

或者,另一种可能性:您的自定义printf() 写入处理浮点数字,但对待%ffloat ,即使你的编译器促进floatdouble穿过时... 寻找你的自定义实现和解决它拉%f从堆栈作为double ,而不是float (您的自定义实现可能会尝试通过执行此操作来得到警告,而人们可能对此一直无视。 va_arg(args,float)在该代码中搜索va_arg(args,float)并将其更改为va_arg(args,double) (当然,该示例中的args是我自己的va_list的变量名;您的变量名可能不同。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM