[英]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;
}
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
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()
写入处理浮点数字,但对待%f
的float
,即使你的编译器促进float
到double
穿过时...
。 寻找你的自定义实现和解决它拉%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.