size t — функции ceil () и floor () в C ++ для типов size_t

У меня есть две переменные:

size_t a = 63;
size_t b = 32;

Я назвал функцию ceil(a/b), Естественно, я бы предположил, что ответ возвращается 2 но вместо этого он возвращает 1,

Я озадачен Я попытался привести переменные к двойной или же ИНТ и это, похоже, не помогает.

Спасибо за любую помощь.

2

Решение

Давайте разберемся, что происходит, когда вы делаете ceil(a/b), Сначала целочисленное деление происходит между a и b, поэтому 63/62 становится 1, а затем 1 приводится к удвоению, чтобы стать 1,0, а затем ceil (1.0), конечно, всего 1,0.

Если вы ожидаете получить 2, вам нужно конвертировать в удвоение до того, как произойдет деление, т.е. ceil(double(a) / double(b)) использует двойное деление.

2

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

ceil а также floor функции работают на double типы. Вы сделали целочисленное деление (потому что size_t целочисленный тип), поэтому результатом является целое число (т.е. это уже целое число, поэтому вы не можете округлить вверх или вниз). Попробуйте привести к double до деления:

ceil( double(a) / double(b) );
floor( double(a) / double(b) );

Технически вам нужно только разыграть первого, потому что тогда вы получите вместо этого деление с плавающей точкой. Но это хорошо, чтобы быть явным и разыграть оба.

0

И 63, и 32 являются целыми числами, поэтому результатом будет int (т.е. 1, а не 1,96875).

Либо введите его, как указано Пэдди или

или используйте двойные значения

ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles
0

a/b будет выполнять целочисленное деление, так как они интеграл типы, которые приведут к 1это объясняет почему станд :: CEIL возвращает значение, которое вы видите. если мы посмотрим на проект стандарта C ++ раздел 5.6 Мультипликативные операторы параграф 4 говорит (акцент мой):

Двоичный / оператор дает частное, а двоичный оператор% — остаток от деления первого выражения на второе. Если второй операнд / или% равен нулю, поведение не определено. Для целых операндов оператор / дает алгебраический фактор с любой отброшенной дробной частью[…]

приведение любого из операндов двойной будет достаточно из-за арифметические преобразования которые рассматриваются в разделе 5 Выражения параграф 10 который говорит (акцент мой):

Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом.. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Эта модель называются обычные арифметические преобразования, которые определены следующим образом:

и включает в себя эту пулю:

В противном случае, если один из операндов является двойным, другой должен быть преобразован в двойной.

Таким образом, следующее выражение даст желаемый результат:

std::ceil( double(a)/b)
0
По вопросам рекламы [email protected]