打印浮点数。(Powerpc)

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
@FelicePollano 这能解决什么问题? - Lundin
1
我的猜测是您没有将浮点库链接到项目中。一些嵌入式编译器提供了使用不支持浮点数的标准库的选项,以提高性能。但即使是这种情况,我仍然认为您应该得到某种错误提示。 - Lundin
1
你尝试使用-mfloat-abi=softfp编译了吗? - Benny
2
哪个操作系统?哪个编译器?使用了什么编译器标志? - Sander De Dycker
@Lundin:我不知道有没有没有FPU的PPC;如果我没记错的话,这是必需的。 - tc.
显示剩余6条评论
2个回答

1

哦,天啊!你的浮点数值 x 正确计算了,无论是由你的 FPU 还是编译器在软件中计算;只是你的 printf() 实现显然没有将 %f 视为 double 处理...

你是否在使用具有自定义 printf() 实现的嵌入式系统?如果是这样,它可能根本没有被编写来处理浮点数,因为在嵌入式系统中通常不使用浮点数,程序员经常选择使用整数变量和固定点算术,这在历史上比浮点数快得多(在小型嵌入式系统上可能仍然如此)。

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

-3

我想这都跟“大端序”和“小端序”有关


我没有点踩,但是在 OP 的代码中没有任何与字节序有关的内容。 - Mysticial
你说得对...你在猜测。你陈述的其他内容都不准确。编程不是一个“猜测”的领域。 - abelenky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接