为什么代码段会引发浮点异常?

问题描述 投票:0回答:2

double what;
for (int i = 1; i < (long)pow(10, 7); i++)
    what = (i + i) / (i * i) - i; 

引发浮点异常(核心已转储)。为什么?我正在使用clang ++。

c++ loops exception arithmetic-expressions
2个回答
0
投票

您的int溢出,因为10 ^ 14不能容纳我从未见过的int(请注意int与平台有关)。在某些平台上,10 ^ 7已经溢出。有符号的溢出总是导致不确定的行为,而有时导致0

  • 您可能希望直接使用适当大小的类型,例如std::uint64_tdouble来存储循环变量。
  • 您为每个单循环迭代计算pow,因为到目前为止pow does not have a constexpr overload。在循环外对此进行一次计算。
  • 您的循环似乎丢弃了除最后一次计算之外的所有内容。也许您可以只计算一个?

0
投票

constexpr循环中的i < (long)pow(10, 7)条件导致整数for变得大于i,导致整数溢出和65535。在某些实现上,undefined behavior可能变为i,从而导致以下表达式: (我/我)成为0。反过来,这可能(例如在Visual Studio中)在调试期间导致Integer Division By Zero异常。

© www.soinside.com 2019 - 2024. All rights reserved.