我正在尝试打印浮点数。尽管可变函数不适用于浮点数,因此它们被提升为双精度。我可以通过将其转换为双精度来设法消除警告。在某些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.5ppc系统结果:
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吗?否则,打印浮点数的优雅方式是什么?
发布于 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变量名称;您的变量名称可能不同。)
发布于 2013-01-15 22:28:18
我猜都是关于"Big Endian“和"Little Endian”的
https://stackoverflow.com/questions/14339452
复制相似问题