Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Будет ли переполнение double при

#java #c_sharp #c


Есть переменная типа double. Каждый раз её увеличивают на 0.01. Будет ли переполнение?
    


Ответы

Ответ 1



С точки зрения теории формата IEEE-754 переполнение при последовательном увеличении числа типа double может наступить только в одном случае: когда операция сложения выполняется с округлением в сторону плюс бесконечности (если исходное число НЕ было бесконечностью). В процессоре по-умолчанию установлен другой флаг округления (nearest-to-even), по какой причине вы никогда не доберётесь до бесконечности, так как, начиная с какого-то момента, прибавление 0,01 перестанет увеличивать вашу переменную. Происходит это потому, что формат с плавающей запятой хранит только самые старшие биты числа. Представьте себе, что (работаем в десятичной системе), у вас в памяти могут храниться только 3 цифры числа. То есть вместо 12345 вы можете хранить только 123 * 10^2. Тогда попробуйте прибавить число 1 Если бы вы могли хранить все 5 цифр, получили бы 12346, но ведь это то же самое, что и было: 123 * 10^2. Ваше прибавление 1 ничего не поменяло, потому что вы уже потеряли последние две цифры из-за ограничений памяти самого формата. Подробнее об этом можно почитать в статье, где разбирается пример "игрушечного" формата на подобии IEEE-754 и показано как при прибавлении к большому числу маленького первое не меняется. Ответ на ваш вопрос: НЕТ. Естественно, мой ответ справедлив для машинной реализации плавающей арифметики в формате IEEE-754, есть много других форматов, там ситуация может быть иной.

Ответ 2



Нет. #include using namespace std; int main() { double v=1000000000000.0*10000000000000.0; cout<<((v!=v+0.01) ? "Yes" : "No"); return 0; } В какой-то момент просто прибавления не будет.

Комментариев нет:

Отправить комментарий