Есть переменная типа double. Каждый раз её увеличивают на 0.01. Будет ли переполнение?
С точки зрения теории формата IEEE-754 переполнение при последовательном увеличении числа типа double может наступить только в одном случае: когда операция сложения выполняется с округлением в сторону плюс бесконечности (если исходное число НЕ было бесконечностью). В процессоре по-умолчанию установлен другой флаг округления (nearest-to-even), по какой причине вы никогда не доберётесь до бесконечности, так как, начиная с какого-то момента, прибавление 0,01 перестанет увеличивать вашу переменную.
Происходит это потому, что формат с плавающей запятой хранит только самые старшие биты числа. Представьте себе, что (работаем в десятичной системе), у вас в памяти могут храниться только 3 цифры числа. То есть вместо 12345 вы можете хранить только 123 * 10^2. Тогда попробуйте прибавить число 1 Если бы вы могли хранить все 5 цифр, получили бы 12346, но ведь это то же самое, что и было: 123 * 10^2. Ваше прибавление 1 ничего не поменяло, потому что вы уже потеряли последние две цифры из-за ограничений памяти самого формата.
Подробнее об этом можно почитать в статье, где разбирается пример "игрушечного" формата на подобии IEEE-754 и показано как при прибавлении к большому числу маленького первое не меняется.
Ответ на ваш вопрос: НЕТ.
Естественно, мой ответ справедлив для машинной реализации плавающей арифметики в формате IEEE-754, есть много других форматов, там ситуация может быть иной.
Нет.
#include <iostream>
using namespace std;
int main()
{
double v=1000000000000.0*10000000000000.0;
cout<<((v!=v+0.01) ? "Yes" : "No");
return 0;
}
В какой-то момент просто прибавления не будет.