Усечение и приведение к int из потолочного двойного

При выполнении std::ceil при двойном значении значение округляется до целого числа. Так что 3.3 станет 4.0. Который может быть приведен или усечен до int, Который будет «отрубать» часть после запятой. Так:

int foo = (int)std::ceil(3.3);

Так что на первый взгляд это будет хранить 4 в foo. Однако double является значением с плавающей запятой. Так что это может быть 4.000000001 или же 3.999999999, Последний будет усечен до 3.

Но на практике я никогда не видел такого поведения. Могу ли я с уверенностью предположить, что любая реализация вернет 4? Или это только IEEE-754 это делает это Или мне просто повезло?

3

Решение

Округление (или потолок) двойного всегда будет всегда, всегда будет точным.

Для чисел с плавающей запятой ниже 2 ^ (m + 1), где m — число битов мантиссала, все целые числа имеют точные представления, поэтому результат может быть точно представлен.

Для чисел с плавающей точкой выше 2 ^ (m + 1) … они уже целые числа. Имеет смысл, если вы подумаете об этом: не хватает битов мантиссала, чтобы растянуть вправо от десятичной точки. Итак, снова округление / потолок является точным.

5

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

ceil в C ++ ведет себя так же, как в C, где стандарт говорит

Функции ceil вычисляют наименьшее целочисленное значение не менее x.

Результат ceil всегда является представлением целого числа с плавающей точкой; однако результат может быть переполнен целочисленным типом при усечении.

В вашем конкретном случае, std::ceil(3.3) должен быть точно 4.0, так как это «наименьшее целочисленное значение не меньше чем» 3.3,

0

По вопросам рекламы [email protected]