Я искал удовлетворительное и безопасное решение моей проблемы двойной точности, указанной для этой проблемы:
![enter image description here](https://i.stack.imgur.com/SUPn4.png)
Эта программа пытается определить, сколько маленьких кружков может поместиться в большой кружок. Он заполняет большой круг, а затем отбирает те, которые пересекают большую окружность. используя эту формулу:
distance_small_pos_from_center + small_radius < big_radius
Все вычисления были в двойном, за исключением вывода экрана на WinForms, который принимает int для координат.
![enter image description here](https://i.stack.imgur.com/OtsgM.png)
На изображении выше показан результат выбраковки. Вы можете видеть, что это не симметрично, когда это действительно должно быть, потому что ограничение состоит в том, что должен быть один маленький круг точно в центре. Я перебираю код и обнаруживаю, что это потому, что некоторые вычисления дают, например,
99.9999999 < 100
Этот ответ C ++ с двойной точностью и округлением говорит, что мы должны использовать всю доступную точность, но в этом случае мне пришлось сделать Math.Round(distance_small_pos_from_center + small_radius, 3)
, используя 3 произвольно.
Результат отбраковки сильно отличается без Math.Round. Оглядываясь назад, это один из видов ошибок, который трудно обнаружить , если бы я его не вытянул . Может быть, я сделал что-то не так, или не понял, удваивает столько, сколько я думал.
Итак, у кого-нибудь есть решения или советы, чтобы избежать такого рода проблем?