C ++ ceil и отрицательный ноль - PullRequest
4 голосов
/ 13 мая 2011

В VC ++ 2008 ceil(-0.5) возвращает -0.0. Это обычное / ожидаемое поведение? Какова лучшая практика, чтобы избежать печати -0.0 для потоков ввода / вывода.

Ответы [ 5 ]

3 голосов
/ 13 мая 2011

Это правильное поведение. См. Унарный оператор- () для нулевых значений - c ++ и http://en.wikipedia.org/wiki/Signed_zero

Я неравнодушен к выполнению static_cast<int>(ceil(-0.5));, но я не утверждаю, что это "лучшая практика".

Редактировать: Конечно, вы можете привести к любому целочисленному типу (uint64_t, long и т. Д.)

2 голосов
/ 13 мая 2011

ceil в C ++ происходит из стандартной библиотеки C.

Стандарт C говорит, что если платформа реализует арифметику IEEE-754, ceil( ) ведет себя так, как если бы ее аргумент был округлен до целого в соответствии с атрибутом округления IEEE-754 roundTowardPositive . Стандарт IEEE-754 гласит (пункт 6.3):

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

Таким образом, знак результата всегда должен совпадать со знаком ввода. Для входных данных в диапазоне (-1,0) это означает, что результат должен быть -0.0.

1 голос
/ 13 мая 2011

Не могу сказать, что знаю, что это обычно, но что касается того, чтобы не печатать его, добавьте чек, примерно так:

if(var == -0.0)
{
    var = 0.0;
}
// continue
0 голосов
/ 13 мая 2011

Я понимаю, почему ceil(-0.5) возвращает -0.0.Это потому, что для отрицательных чисел ceil возвращает целую часть операнда:

double af8IntPart;
double af8FracPart = modf(-0.5, & af8IntPart);
cout << af8IntPart;

Выходные данные здесь "-0.0"

0 голосов
/ 13 мая 2011

Да, это обычно.

int number = (int) ceil(-0.5);

число будет 0

...