Здравствуйте, Constructor, Вы писали:
R>>>Здесь фишка в том, что у std::round тип возвращамого значения тот же, что и у параметра. Поэтому явный каст к нужному типу вполне приемлем, я считаю:
R>>>R>>>int value = int(std::round(3.14f));
R>>>
BFE>>А гарантия того, что в value будет 3, а не 2 есть?
C>Только для относительно небольших чисел. (1ull << std::numeric_limits<Real>::digits) + 1 — первое целое число, которое не имеет точного представления в вещественном типе Real. К этому и подобным ему числам значения вещественного типа не смогут округлиться.
C>Для float число значащих цифр мантиссы равно 23 + 1 = 24, поэтому пограничное "хорошее" число (которым завершается непрерывная последовательность целых чисел, представимых типом float) будет равно 16.777.216.
Эти рассуждения, конечно же верны и на их основании мы можем сделать вывод, что не всякое целое может быть представлено в виде float. Другими словами, слишком большая потеря точности может возникнуть при преобразовании int -> float. Но вопрос ведь сейчас стоит об обратном преобразовании: float -> int: может ли случиться так, что при преобразовании результа выражениия
std::round(f) к целому числу, будет выбрано число, не самое близкое к результату выражения? (Где f имеет тип float и находится в диапазоне [std::numeric_limits<int>::min(), std::numeric_limits<int>::max()])