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

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

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

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

«-0.000» печатается. но я хочу «0,000».

Обратите внимание, что все другие отрицательные числа (например, -0,001) должны по-прежнему печататься со знаком минус перед ними, поэтому просто * -1 не будет работать.

10

Решение

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

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

3

Другие решения

Как насчет:

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;
}
}
1