Информация об изменениях

Сообщение Re[4]: использование round от 11.02.2018 22:55

Изменено 11.02.2018 22:56 rg45

Re[4]: использование round
Здравствуйте, 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: может ли случиться так, что при преобразовании результа выражениия int(std::round(float(x))) будет выбрано число, не самое близкое к результату?
Re[4]: использование round
Здравствуйте, 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(float(x)) к целому числу, будет выбрано число, не самое близкое к результату выражения?