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

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

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

cout < fixed < setprecision(3);
cout < (-0.0001) < endl;
 Jerry Coffin21 сент. 2012 г., 21:03
Похоже, вы говорите о двух разных вещах: отрицательный ноль и отрицательное число, достаточно маленькое, чтобы при печати оно округлялось до нуля с определенной точностью. Что вы хотите предотвратить?
 Tony The Lion21 сент. 2012 г., 20:47
AFAIK минус число, умноженное на другое число минус, дает положительное число. Тот'Базовая математика. Какие'Ваша точка зрения?
 Ali21 сент. 2012 г., 20:45
@TonyTheLion, что если мой номер -0,001? это должно быть напечатано -0.001, и я не должент * -1 это.
 Tony The Lion21 сент. 2012 г., 20:48
Вы должны проверить, что ваш номер не является положительным, прежде чем вы сделаете * -1, иначе вы 'Я получу отрицательное число в качестве вывода.
 Ali21 сент. 2012 г., 20:51
@TonyTheLion Я должен умножить на -1 только тогда, когда результат -0,000. не все отрицательные числа как ты сказалВам нужно будет проверить, что ваш номер не является положительным, прежде чем делать * -1 "
 Tony The Lion21 сент. 2012 г., 20:41
Сделать результат * -1

Ответы на вопрос(3)

Решение Вопроса

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

 nneonneo21 сент. 2012 г., 21:00
@wallyk: вы можетеt возвращает различные типы из условного выражения в C ++.
 Ali21 сент. 2012 г., 21:00
@wallyk это 'не нужно. потому что setprecision (3) вызывается до этого.
 Mahmoud Aladdin21 сент. 2012 г., 21:01
@ Али: хорошо, изменил это.
 Ali21 сент. 2012 г., 20:56
так должно быть: 'кут << (абс) 0,0005)? 0,000: ответ << епсИ;»
 Eric Postpischil21 сент. 2012 г., 21:58
@Aladdin:
 Eric Postpischil21 сент. 2012 г., 21:14
Этот код не компилируется.
 wallyk21 сент. 2012 г., 21:02
@nneonneo: О да. Я делал слишком много JavaScript и PHP в последнее время.
 Mahmoud Aladdin21 сент. 2012 г., 21:21
Добавьте скобки вокруг комбинации () ?:, она должна работать нормально !!
 Mahmoud Aladdin21 сент. 2012 г., 21:29
@Eric: он должен быть разобран как (cout.operator <<(()? :)). Оператор <<(ЕпсИ); Почему он ведет себя так, как вы говорите?

а не о фиксированной единице в 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;
   }
}

Как насчет:

cout << (value == 0.0 ? abs(value) : value)  << endl;
 GreyBeardedGeek22 сент. 2012 г., 03:07
@IronMensan - что вы узнали из этой статьи? "стандарт IEEE определяет сравнение так, чтобы +0 = -0 "...так что я'Я искренне заинтересован - не могли бы вы указать мне на то, что более четко объясняет проблему? Стив Джессоп - мне кажется, что основная часть вопроса задается только об отрицательном 0. Я что-то пропустил?
 IronMensan21 сент. 2012 г., 22:14
Есть много ресурсов онлайн, объясняющих, почемуvalue == 0.0 плохая идеяdocs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html это хорошо
 Steve Jessop21 сент. 2012 г., 23:36
Этот ответ был бы правильным (и хорошей идеей), если бы спрашивающий действительно хотел поймать только отрицательный 0. Но основная часть вопроса показывает, чтодело не в этом.
 Steve Jessop24 сент. 2012 г., 10:50
Да, основная часть вопроса говорит о том, что спрашивающий хочет"0.000" быть напечатанным вместо"-0.000" для значения-0.0001, Так что'не только отрицательный ноль, который нужно обрабатывать специально,-0.0001 тоже По сути, спрашивающий имеет в виду любой вывод"-0.000" отcout как "отрицательный нольони неэто просто означает IEEE отрицательный ноль в.value

Ваш ответ на вопрос