C代码中的浮点异常

时间:2016-10-07 20:58:15

标签: c int bit floating-point-exceptions

#include <stdio.h>
int test1(int x, int n){
    int times=31/n;
    return ((1-(1<<(n*times)))/(1-(1<<n)));
}

我正在进行计算,其中1 <= n <= 32

仅当1&lt; = n&lt; = 31时才有效,如何在n = 32时更改?当我在xcode中测试其n = 32的情况时,它会触发调试器并显示线程1 exc_arithmetic(code = exc_i386_div ....
      提前谢谢。

3 个答案:

答案 0 :(得分:1)

有一个很好的机会,当你1 << 32时,它被视为1 << 0(并且,因为你正在调用未定义的行为,那没关系),然后你得到'浮动点'异常'因为你正在做一个整数'除以零'。这些天,这是例外的最常见原因。如果你正在进行浮点运算,你会得到一个无穷大(无声)返回除以零。

答案 1 :(得分:0)

我刚刚发现了如何解决这个问题。问题是1<<32案例(我会尽量避免)。

我将1 << n更改为(1 << (n-1) )*2,这是另一种应用数学的方法。

return ((1-(1<<(n*times)))/(1- (1<<(n-1))*2  ));

答案 2 :(得分:0)

2-s补码平台的一些现代实现产生了一个&#34;浮点异常&#34;响应于以下代码中出现的整数除法溢出

int a = INT_MIN;
int b = -1;
int c = a / b;

甚至认为没有什么&#34;漂浮&#34;那里。海湾合作委员会就是这种平台的一个例子。

显然,你的表达遇到的问题与过度移动&#34;触发的未定义行为的实际平台特定表现相同。一个整数。

P.S。正如@Jonathan Leffler所指出的,整数除以零也会产生一个&#34;浮点异常&#34;在GCC中,你的情况可能更有可能发生。