При выполнении 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
это делает это Или мне просто повезло?
Округление (или потолок) двойного всегда будет всегда, всегда будет точным.
Для чисел с плавающей запятой ниже 2 ^ (m + 1), где m — число битов мантиссала, все целые числа имеют точные представления, поэтому результат может быть точно представлен.
Для чисел с плавающей точкой выше 2 ^ (m + 1) … они уже целые числа. Имеет смысл, если вы подумаете об этом: не хватает битов мантиссала, чтобы растянуть вправо от десятичной точки. Итак, снова округление / потолок является точным.
ceil
в C ++ ведет себя так же, как в C, где стандарт говорит
Функции ceil вычисляют наименьшее целочисленное значение не менее x.
Результат ceil
всегда является представлением целого числа с плавающей точкой; однако результат может быть переполнен целочисленным типом при усечении.
В вашем конкретном случае, std::ceil(3.3)
должен быть точно 4.0
, так как это «наименьшее целочисленное значение не меньше чем» 3.3
,