@romajke

Как избежать переполнения типа данных?

while ( x >= y)
{
//...
//code
//...
double x = a/b;
}

Проблема в том, что при делении a/b получается число с очень большим количеством знаков после запятой. И с каждой итерацией цикла количество знаков увеличивается. Мне же в принципе такая огромная точность не нужна, и вполне бы хватило 6-8 знаков после запятой. Можно ли как то избежать переполнения типа данных, например ограничив количество знаков после запятой при вычислениях? (это единственное что приходит мне в голову, но я не знаю возможно ли это) Или каким то другим способом?
  • Вопрос задан
  • 1670 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Никакого переполнения не будет. Переполнение возникает когда результат операции становится больше максимально допустимого значения для конкретного типа данных. Для типа double это 1.7976931348623157E+308.
Ответ написан
@MadridianFox
Web-программист, многостаночник
Точность вычислений вы устанавливаете выбирая тип данных - float или double. Не важно как сильно вы раздробили число, количество занимаемой им памяти не меняется. Т.е. вам нужно "обрезать" его только при выводе, чтобы лишние цифры глаза не мозолили.

Обрезание производлится по некоторым правилам, которые вы наверняка учили в школе, и называть это надо "округление". Т.е. вам достаточно набрать в гугле "Как округлить число до нужного знака после запятой в Си".

Переполнением в Си называется случай, когда вы увеличивая значение переменной достигаете предела и следующее увеличение обнуляет переменную или меняет её знак.
Ответ написан
Комментировать
@Gryphon88
Для сравнения двух float или double некорректно использовать x > y, рекомендуется писать x - y > eps, где eps - минимальное значимое различие, определены макросы FLT_EPSILON, DBL_EPSILON. Хорошая подробная серия статей про вычисления с плавающей точкой лежит тут.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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