首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印浮点。(Powerpc)

打印浮点。(Powerpc)
EN

Stack Overflow用户
提问于 2013-01-15 22:05:41
回答 2查看 739关注 0票数 8

我正在尝试打印浮点数。尽管可变函数不适用于浮点数,因此它们被提升为双精度。我可以通过将其转换为双精度来设法消除警告。在某些powerpc架构上打印结果时,如果使用%f打印,则会给出不正确的值。为什么?

测试代码:

代码语言:javascript
复制
 #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系统结果:

代码语言:javascript
复制
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系统结果:

代码语言:javascript
复制
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

这是工具链中的一个bug吗?否则,打印浮点数的优雅方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2013-02-01 05:58:27

哦,糟了!您的x 的浮点值是正在正确计算的,无论您的FPU是否在做这件事,或者您的编译器是否在软件中为您做这件事;只是您的printf()实现显然没有将%f视为double...

您使用的是具有自定义printf()实现的嵌入式系统吗?如果是这样的话,它很可能不是用来处理浮点数的,因为在嵌入式系统中浮点数通常不被使用,在嵌入式系统中,程序员通常选择使用整数变量&定点算术,这在历史上比浮点快得多(在小型嵌入式系统中可能仍然存在)。

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-15 22:28:18

我猜都是关于"Big Endian“和"Little Endian”的

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14339452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档