Задать вопрос
@newuser8888

Не могу понять принцип округления float point, объясните на примере цифры?

5f91a7f7a1125800167976.png
Например есть цифра 2.999999 - она не округляется. Точность количества цифр у float single precison 7.
Окей, я зашел за границу, 2.999999(9) - число округляется к 3. В тексте написано что округления идет к ближнему(4 - вниз, 5- вверх) тогда почему 2.999999(8) не 3, а 2.9999997615814208984375. Ведь 8 больше 5 и округление идет вверх?
  • Вопрос задан
  • 161 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
1. Округление к чётному. Это стандартное округление к ближайшему; если расстояние одинаково — то к чётному.
4,4 → 4
4,5 → 4
4,6 → 5
−4,4 → −4
−4,5 → −4
−4,6 → −5
5,4 → 5
5,5 → 6
5,6 → 6
−5,4 → −5
−5,5 → −6
−5,6 → −6

2. Округление вниз к −∞. Округление к меньшему.
4,xxx → 4 (при любой дробной части)
−4,xxx → −5

3. Округление вверх к +∞. Округление к бóльшему.
4,xxx → 5
−4,xxx → −4

4. Отбрасывание дробной части. Округление к 0. Округление к меньшему по модулю.
4,xxx → 4
−4,xxx → −4

Столько много знаков у double — так что где-то в недрах библиотеки float стал double’ом. Знаков у float не точно 7, а чуть больше семи. И это число действительно не тройка: тройка имеет 16-й вид 4040.0000, а ваше число — 403F.FFFF. Как вы видите, величина единицы младшего разряда (ULP) на таких величинах будет около 2,4·10−7 — поболее семи знаков будет, но до восьми не дотягивает.

Механизмы округления IEEE 754 не имеют никакого отношения к десятичному округлению, прописанному в библиотеке языка. Округление IEEE на самом деле двоичное и используется при переводе из более точного типа в менее точный, или чтобы округлить результат умножения/деления.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы