-1

是否可以修改下面的代码,使其即使在启用快速数学的 GCC 编译时也能正常工作?

#include <iostream>
#include <float.h>

using namespace std;

int main()
{
  char divider = 2;
  float power = 1;
  float number = 1;
  float current = number + power;
  cout.precision(20);
  // Divide until rounded off
  while(current != number)
  {
    power /= divider;
    current = number + power;
    //cout << current << endl;
  }

  cout << power * divider << endl;
  cout << FLT_EPSILON << endl;
}

注意:我在头文件中有它,但我没有设法关闭头文件的快速数学。请参阅奇怪的 while 循环行为如何禁用头文件函数的快速数学运算

4

2 回答 2

2

您可以将 constexpr 函数中的计算转换为常量表达式:

constexpr float compute_epsilon()
{
  char divider = 2;
  float power = 1;
  float number = 1;
  float current = number + power;
  // Divide until rounded off
  while(current != number)
  {
    power /= divider;
    current = number + power;
  }
  return power * divider;
}
constexpr auto epsilon = compute_epsilon();

演示

于 2020-05-21T21:37:53.910 回答
0

将这段代码添加到循环中为我解决了这个问题。

std::ostringstream buff;
    buff << current

编辑:

即使将其添加到条件中也可以:

 && ! isinf(current)
于 2020-06-26T19:03:48.300 回答