14

当我在支持软件浮点仿真(禁用硬件浮点)的 32 位 powerpc 内核中运行以下 C++ 程序时,我得到一个不正确的条件评估。有人能告诉我这里潜在的问题是什么吗?

#include <stdio.h>

int main() {
   int newmax = 1;
   if ((newmax + 0.0) > 256) {
       printf("\nShouldn't be here\n");
   } else {
       printf("\nShould be here\n");
   }
}

编译:

powerpc-linux-g++ -msoft-float -c floating.cxx
powerpc-linux-g++  -o floating floating.o

目标系统中的输出:

[linux:/]$ ./floating
Shouldn't be here
4

4 回答 4

1

您还应该在链接时指定 -msoft-float 给我们一个带有 -S 标志的反汇编:powerpc-linux-g++ -msoft-float -c floating.cxx -S -o floating.s

于 2013-05-22T11:36:43.013 回答
0

首先,为什么禁用硬件浮点?

由于这种类型的转换可能会以不正确的顺序执行。

(double)1 = 0x3FF0000000000000
(float) 1 = 0x3F800000

这是你的条件。

if ((newmax + 0.0) > 256)

在您的情况下:1)newmax 转换为浮动或双倍;2)加0.0;3) 将值转换回 int。

这取决于您的机器,但 int 通常是 32 位值。要检查它,您可以使用:

int i;
printf("%d", sizeof(i));

无论如何,回到你的问题,在计算值转换为 int 之后,你会得到很大的正数。在您的情况下,我会打印它/或不与 0x100 比较,而是与

0x3F800000, 0x3FF0000000000000, 0x3FF00000

要找出发生了什么,但拆卸是最好的选择。

可能它没有那么有帮助,但这只是我的想法,发生了什么。

于 2013-06-25T06:22:14.370 回答
0

这可能是从编译器错误到汇编器错误到链接器错误到内核错误的任何内容。正如其他人已经指出的那样:如果您使用 -S 选项提供编译输出,则可以验证(或排除)编译器错误 - 这是此错误的最可能来源。如果不是编译器错误,浮点仿真的内核错误将是下一个可能的问题根源。

于 2013-06-27T14:49:24.657 回答
-1

代码 newmax + 0.0 中的语句产生浮点或双精度结果,但与整数值进行比较。

因此这个错误。

试试这个,

int i=1;
printf("%d",(i+0.0));

无论 i 的值是多少,每次都会得到结果 0。然而,

int i=1;
printf("%f",(i+0.0));

这产生 1.0000

于 2013-06-27T05:53:28.720 回答