为什么这个程序会出现浮点异常?

Azi*_*ala 1 c floating-point

#include <stdio.h>

int
main()
{
  int i;
  int c;
  int a[30] = { 5,  7,  11, 13,  17,  19,  23,  29,  31,  37,
                41, 43, 47, 53,  59,  61,  67,  71,  73,  79,
                83, 89, 97, 101, 103, 107, 109, 113, 127, 131 };
  for (i = 0; i < 30; i++) {
    c = (a[i] + i) / (i - 1);
    printf("Value of c is %d", c);
  }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我在这个程序中面临浮点异常错误。

zwo*_*wol 7

for(i = 0; i < 30; i++){
    c = (a[i] + i)/(i-1);
Run Code Online (Sandbox Code Playgroud)

在此循环的第二次迭代中,您除以零。

由于历史原因,在 Unix 系统上,整数被零除是使用相同的信号(SIGFPE,“浮点异常”)报告的,该信号用于报告实际由浮点算术引起的错误。现在无法更改,因为太多现有程序依赖于它。

(我不知道实际上是什么历史原因。它们可能类似于“PDP-11 有一个浮点除法指令而不是整数除法指令,所以原始的 C 编译器使用浮点数学来实现整数除法”,但我只是编造的,如果这是真的,那是偶然的。)

(具有讽刺意味的是,在现代 CPU 上,浮点除以零通常会产生 ±Inf 结果但不会触发信号,除非您fesetenv用来打开陷阱。)