浮点行为不正确

时间:2013-02-23 20:34:03

标签: c++ floating-point embedded-linux ieee-754 powerpc

当我在支持软件浮动仿真(禁用硬件浮点)的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 个答案:

答案 0 :(得分:1)

链接时也应指定-msoft-float  用-S标志给我们一个反汇编:powerpc-linux-g ++ -msoft-float -c floating.cxx -S -o floating.s

答案 1 :(得分: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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

代码newmax + 0.0中的语句产生float或double的结果,但会与整数值进行比较。

因此这个错误。

试试这个,

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

无论i的值是多少,每次都得到一个结果为0。 而,

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

这会产生1.0000