ML19

Задача. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

Тесты

Длина окружности Точность  Результат работы программы
0 3 Невозможно выполнить для вырожденной окружности
-1 8 Ошибка ввода данных
34 -5 Ошибка ввода данных
25 18 Вывод с заданной точностью невозможен. Максимально возможная точность 13
25 13 49.7359197162173
83 5 548.20920
113.42 3 1 023.692
12 345 678 3 Вывод с заданной точностью невозможен. Максимально возможная точность 1
12 345 678 1 12 128 861 224 697.9
1 000 000 000 0 Число содержит больше 15 значащих цифр. Точный вывод невозможен

Алгоритм

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

Для удобства преобразуем известные нам формулы:

[latex]L = 2 \pi \cdot R[/latex]   [latex]S = \pi \cdot R^2 [/latex]  [latex] \longrightarrow[/latex]  [latex]R= \frac{L}{2\pi}[/latex]  [latex]\longrightarrow[/latex]  [latex]S = \frac{L^2}{4\pi}[/latex];

Воспользовавшись данной формулой находим искомую величину. Однако реализуя вывод с заданной точностью, требуется проверить сможет ли используемый нами тип данных double его обеспечить. Принимая во внимание факт, что данный тип хранит не более чем [latex]15[/latex] значащих десятичных цифр осуществляем следующую последовательность действий:

  1. Находим значение переменной possibleAccuracy как разность между максимально возможным количеством значащих цифр (maxAccuracy = [latex]15[/latex]) и имеющемся в данном числе .
  2. Отрицательное значение переменной possibleAccuracy сигнализирует о том, что найденная площадь круга превышает [latex] 10^{15} [/latex]. Следовательно, выводим предупреждение о том, что точный подсчет невозможен даже с нулевой точностью после запятой.
  3. При условии, что запрашиваемая точность превышает максимальную, выводим уведомление и значение максимальной точности.
  4. При ложности  пункта 2 и 3, используя манипулятор setprecision, выводим нужное количество знаков.

Код программы:

 

Код программы

5 thoughts on “ML19

  1. Не возражаю против такого добровольного усложнения задачи. Однако, если Вы решили потребовать определённое количество знаков после десятичной запятой, то нужно будет учесть, что double может гарантировано хранить (проверьте меня, я могу ошибаться!) 16 значащих десятичных цифр. Т.е. если число больше 1016, то после запятой вообще ничего не может быть. Причём это касается и результатов промежуточных вычислений.
    В вашем случае это означает, что у Вас есть два пути довести публикацию до ума:
    1. В условии нужно указать тип данных и проверять возможно ли для него гарантировать столько правильных знаков после запятой. Если нет, то вывести сообщение.
    2. Указать ограничение на диапазоны в котором могут задаваться все входные данные.

  2. — Что произойдёт если circumference будет 0?
    — Почему accuracy, possibleAccuracy не целого типа? Если это количество знаков после запятой, то это неотрицательные целые числа.
    — Писать просто 16 в possibleAccuracy = 16 — ceil(log10(circleArea)). Нужно описать константу. И хорошо бы прочесть это и выяснить гарантированное значение.

    • Спасибо за замечания. Исправила, а именно:
      — До правки программа выводила уведомление об ошибке ввода данных. Сейчас сделан вывод отдельного сообщения для случая вырожденной окружности.
      — Исправлено.
      — Исправлено. Также статья перечитана вновь, но мне не удалось найти ответ более конкретный, чем «with full 15–17 decimal digits precision». Попыталась определить практически, когда начинает возникать погрешность. После повторной проверки был найден контрпример, когда результат не совпадал с тестом для 16 десятичных цифр, поэтому снизила максимально возможную точность до 15 десятичных цифр. На данный момент результат работы программы полностью совпадает с проведенными мною вычислениями.

      • По ссылке указано, что для хранения мантиссы числа с двойной точностью используется 52 бита. Значит минимальное значение с ненулевым старшим битом 251, а это означает, что гарантировано действительно представимо только 15 значащих десятичных цифр.

        Зачтено.

Добавить комментарий