nayka, ваша основная проблема в том, что ваши "калькуляторы" используют значительно меньшую разрядность при вычислениях, чем не обходимо для получения точного результата с такими близкими значениями координат точек. Как решить эту проблему? Очевидно же: сделать координаты точек максимально различными!
Вычте в столбик координаты первой точки (точки
A) из координат второй (точки
B) и третьей (точки
С), а дальше считайте любым из ваших методов (или всеми тремя для убедительности). Производимая над точкой
C операция равносильно её переносу на вектор, лежащий в плоскости, расстояние до которой от этой точки вычисляется, и, очевидно, это расстояние не меняет. Добавление/вычитание вектора
OA к/из вектора
OB не меняет векторное произведение этих двух векторов, которое нужно для вычисления нормали к плоскости. При этом проделываемые операции убирают из обрабатываемых векторов схожесть старших битов мантиссы величин, в результате чего разности в процессе вычисления перестают быть столь неточными (или вообще равными нулю) даже при очень низкой разрядности представления чисел.
Я даже помогу вам с этим первым этапом (только вы проверьте, вдруг я обсчитался):
Код:
Плоскость задана 3 точками A, B и O. Найти наименьшее расстояние (нормаль) от точки С до плоскости:
A: 3593587.80504039, 1579311.28483578, 5010324.36037068
B: 0000078.88741965, 0000055.53365372, 0000135.10499754
C: 0000751.93922067,-0001099.10349491,-0000191.75669294
O: 0000000.00000000, 0000000.00000000, 0000000.00000000
Обратите внимание на то, как при вычислении компонентов вектора нормали
n перестали вычитаться друг из друга очень близкие числа.