此
double what;
for (int i = 1; i < (long)pow(10, 7); i++)
what = (i + i) / (i * i) - i;
引发浮点异常(核心已转储)。为什么?我正在使用clang ++。
您的int
溢出,因为10 ^ 14不能容纳我从未见过的int
(请注意int
与平台有关)。在某些平台上,10 ^ 7已经溢出。有符号的溢出总是导致不确定的行为,而有时导致0
。
std::uint64_t
或double
来存储循环变量。pow
,因为到目前为止pow
does not have a constexpr
overload。在循环外对此进行一次计算。constexpr
循环中的i < (long)pow(10, 7)
条件导致整数for
变得大于i
,导致整数溢出和65535
。在某些实现上,undefined behavior可能变为i
,从而导致以下表达式: (我/我)成为0
。反过来,这可能(例如在Visual Studio中)在调试期间导致Integer Division By Zero异常。