Каков наилучший способ избежать отрицательного нуля в выходе?

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

например, в следующем коде:

cout << fixed << setprecision(3);
cout << (-0.0001) << endl;

"- 0.000". но я хочу "0.000".

Обратите внимание, что все остальные отрицательные числа (например, -0.001) должны быть напечатаны с предшествующим знаком минус, поэтому просто * -1 не будет работать.

Ответ 1

Попробуйте в зависимости от вашей точности.

cout << ((abs(ans) < 0.0005)? 0.000: ans) << endl;

Ответ 2

Как насчет:

cout << (value == 0.0 ? abs(value) : value)  << endl;

Ответ 3

Если вам небезразлична произвольная точность, а не только фиксированная в 3, вам потребуется небольшая работа. В принципе, вам нужно будет выполнить предварительную проверку перед cout, чтобы узнать, будет ли номер форматироваться так, как вам не нравится.

Вам нужно найти порядок величины, чтобы увидеть, будут ли потеряны неточные цифры, оставив только знаковый бит.

Вы можете сделать это, используя логарифм базы 10 абсолютного значения числа. Если отрицательный результат больше, чем установленная вами точность, номер будет отображаться так, как вы не хотите.

log10 0,0001 составляет -4.

отрицательный (-4) равен 4.

4 > 3 (произвольная точность) Таким образом, значение покажется неуместным.

В очень плохом псевдокоде:

float iHateNegativeZeros(float theFloat, int precision)
{
   if((theFloat < 0.0f) &&
      (-log10(abs(theFloat)) > precision))
   {
     return -theFloat;
   }
   else
   {  
     return theFloat;
   }
}