以最小可能valueTest递增两倍

时间:2012-01-16 19:10:40

标签: c++ double

我想将一个double值从它可以采用的最小可能(负)值增加到它可以采用的最大可能值。

我从这开始:

int main()
{
  double min(numeric_limits<double>::min());

  double i(min);

  while(i < 0);
  {
      cout << i << endl;
      i += min ;
  }
}

不幸的是,这不会产生预期的结果 - 在一次迭代后跳过while循环。

有没有更好的方法来实现我的目标?

3 个答案:

答案 0 :(得分:4)

我猜你的代码是什么:你想从最大可能的负值开始,并以尽可能小的步长将其增加到正无穷大,直到该值不再为负。

我认为你想要的功能是nextafter()

int main() {
    double value(-std::numeric_limits<double>::max());
    while(value < 0) {
        std::cout << value << '\n';
        value = std::nextafter(value,std::numeric_limits<double>::infinity());
    }
}

答案 1 :(得分:0)

首先,

  while(i < 0);           // <--- remove this semicolon
  {
      cout << i << endl;
      i += min ;
  }

然后,std::numeric_limits<double>::min() is a positive value,所以i < 0永远不会成真。如果您需要最负值,则需要

double min = -std::numeric_limits<double>::max();

但我不知道你的i += min行应该做什么。添加两个最负数将只产生-∞,并且循环永远不会完成。如果你想添加一个数字,你需要另一个变量,比如

double most_negative = -std::numeric_limits<double>::max();
double most_positive = std::numeric_limits<double>::max();

double i = most_negative;
while (i < 0)
{
   std::cout << i << std::endl;
   i += most_positive;
}

当然这只会打印最负数(-1.8e + 308),然后i变为0并且循环将退出。

答案 2 :(得分:0)

以下按顺序遍历所有浮点值。当u.mind增加时,连续值之间的步骤变小。 不能保证这是正确的,并且需要很长时间才能完成,这不是便携式的,双打和......等等也需要更长的时间。

#include <cassert>
#include <iostream>
#include <limits>

union umin {
   float mind;
   int mini;
} u;

int main()
{
   u.mind = std::numeric_limits<float>::max();
   std::cout << -u.mind << " " << u.mini << std::endl;
   while ( u.mind > 0 ) {
      float previous = u.mind;
      u.mini -= 1;
      std::cout << -u.mind << " " << u.mini << " " << previous - u.mind << std::endl;
      assert( previous > u.mind );
   }
}