Сообщение Re[4]: использование round от 11.02.2018 22:55
Изменено 11.02.2018 23:01 rg45
Re[4]: использование round
Здравствуйте, Constructor, Вы писали:
R>>>Здесь фишка в том, что у std::round тип возвращамого значения тот же, что и у параметра. Поэтому явный каст к нужному типу вполне приемлем, я считаю:
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)) к целому числу, будет выбрано число, не самое близкое к результату выражения?
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)) к целому числу, будет выбрано число, не самое близкое к результату выражения?
Re[4]: использование round
Здравствуйте, Constructor, Вы писали:
R>>>Здесь фишка в том, что у std::round тип возвращамого значения тот же, что и у параметра. Поэтому явный каст к нужному типу вполне приемлем, я считаю:
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)) к целому числу, будет выбрано число, не самое близкое к результату выражения? (Подразумевается, что x находится в диапазоне [std::numeric_limits<int>::min(), std::numeric_limits<int>::max()])
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)) к целому числу, будет выбрано число, не самое близкое к результату выражения? (Подразумевается, что x находится в диапазоне [std::numeric_limits<int>::min(), std::numeric_limits<int>::max()])