Re[4]: использование round
От: rg45 СССР  
Дата: 11.02.18 22:55
Оценка:
Здравствуйте, 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()])
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 11.02.2018 23:06 rg45 . Предыдущая версия . Еще …
Отредактировано 11.02.2018 23:01 rg45 . Предыдущая версия .
Отредактировано 11.02.2018 22:57 rg45 . Предыдущая версия .
Отредактировано 11.02.2018 22:56 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.