繁体   English   中英

C代码中的浮点异常

[英]floating point exception in C code

#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<=n<=31 时有效,我如何将其更改为 n=32? 当我在 xcode 中测试它的 n=32 情况时,它会触发调试器并显示线程 1 exc_arithmetic(code=exc_i386_div....
先感谢您。

当您执行1 << 32 ,很有可能将其视为1 << 0 (并且,因为您调用的是未定义的行为,所以没问题),然后您会得到“浮点异常”,因为您是做一个整数“除以零”。 如今,这是导致异常的最常见原因。 如果你在做浮点运算,你会得到一个无穷大(悄悄地)被零除。

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

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

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

2's-complement 平台的一些现代实现生成“浮点异常”以响应以下代码中发生的整数除法溢出

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

甚至认为那里没有“漂浮”的东西。 GCC 就是这种平台的一个例子。

显然,您的表达式遇到了与“过度移动”整数触发的未定义行为的实际平台特定表现形式相同的问题。

PS 正如@Jonathan Leffler 所指出的,整数除以零也会在 GCC 中生成“浮点异常”,这在您的情况下可能更容易发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM