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

202
16 октября 2021, 14:40

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

Answer 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, есть много других форматов, там ситуация может быть иной.

Answer 2

Нет.

#include <iostream>
using namespace std;
int main()
{
    double v=1000000000000.0*10000000000000.0;
    cout<<((v!=v+0.01) ? "Yes" : "No");
    return 0;
}

В какой-то момент просто прибавления не будет.

READ ALSO
PhpMyAdmin. Вопросы вместо русских букв

PhpMyAdmin. Вопросы вместо русских букв

У меня в phpMyAdmin вместо русских букв в таблице отображаются знаки вопросаЯ понимаю, что это проблемы с кодировкой, но не могу перекодировать...

284
Можете пожалуйста помочь, напишите что у меня не так. Я хочу что бы статьи были слева, а комментарии справа, но ничего не работает

Можете пожалуйста помочь, напишите что у меня не так. Я хочу что бы статьи были слева, а комментарии справа, но ничего не работает

Можете пожалуйста помочь, напишите что у меня не такЯ хочу что бы статьи были слева, а комментарии справа, но ничего не работает

98
Сохранение скриншота работы в Qt C++

Сохранение скриншота работы в Qt C++

Помогите пожалуйстаУ меня есть одна проблема, мне нужно сохранить результаты работы в программе в виде скриншота в папку, где находиться...

144