[英]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.