gpt4 book ai didi

c - 打印 float 。 (PowerPC)

转载 作者:太空狗 更新时间:2023-10-29 17:04:20 27 4
gpt4 key购买 nike

我正在尝试打印 float 。尽管可变参数函数不适用于 float ,因此它们被提升为 double 。我可以通过将其转换为 double 来设法消除警告。在某些 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() 实现的嵌入式系统上?如果是这样,它可能不是为了处理 float 而编写的,因为 float 通常甚至不用于嵌入式系统,程序员通常选择使用整数变量和定点算法,这在历史上比 float (并且可能仍然在小型嵌入式系统上)。

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

关于c - 打印 float 。 (PowerPC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339452/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com