Увеличение в два раза на наименьшее возможное значениеTest - PullRequest
2 голосов
/ 16 января 2012

Я хочу увеличить двойное значение с минимально возможного (отрицательного) значения до максимально возможного.

Я начал с этого:

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

  double i(min);

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

К сожалению, это не дает желаемого результата - цикл while пропускается после одной итерации.

Есть ли лучший способ достичь моей цели?

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Я предполагаю, что вы хотите от своего кода: вы хотите начать с наибольшее возможное отрицательное значение и увеличивать его до положительной бесконечности за наименьшие возможные шаги, пока значение не перестанет быть отрицательным.

Я думаю, что вам нужна функция 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());
    }
}
0 голосов
/ 18 января 2012

Следующее проходит через все значения с плавающей точкой «по порядку». Шаг между последовательными значениями уменьшается по мере увеличения 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 );
   }
}
0 голосов
/ 16 января 2012

Сначала

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

Затем std::numeric_limits<double>::min() является положительным значением , поэтому 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и цикл завершится.

...