Есть две проблемы.
1. Даны два числа - диапазон, в котором находится решение уравнения. Поиск решения производится делением отрезка пополам. Обусловлено тем, что другие способы решения (например, метод хорд или метод касательных) крайне не эффективны и чаще всего не сходятся.
Проблема же заключается в том, что если границы отрезка есть очень малые значения, то при получении середины отрезка получаем одно из граничных значений, вместо среднего. Например:
x1 = 0.00000000000000030426102110965129;
x2 = 0.00000000000000030426102110965134;
Получаем x = 0.00000000000000030426102110965134
x1 = -0.000000000000000070906981940269862;
x2 = -0.000000000000000070906981940269849;
Получаем x = -0.000000000000000070906981940269862
Пытался преобразовывать значащие цифры в long получить (x1+x2) / 2 и преобразовывать обратно в double. Однако такой способ тоже в какие-то определенные моменты приводит к ошибкам + медленный (за счет вычисление степени числа). Может быть кто-нибудь знает как это проще выполнить?
2. Производится вычисление массива чисел. Каждый последующий элемент массива определенным образом зависит от всех предыдущих. В результате значения растут достаточно быстро с увеличением длины массива, и выходит за рамки ±1.7×10E308. В дальнейшем производится нормировка данного массива, т.е. A[i] / summa (A[i]^2, i=0..N-1) . Результирующий массив в рамки double, вообще говоря, помещается.
Есть какие-нибудь простые способы решения данной проблемы? Пока приходится использовать собственную структуру, представляющую из себя два числа int (степень) и double (значение от ~0.99 до ~9.99). Однако это очень пагубно влияет на общую производительность и, к тому же, крайне не удобно.
Так же быть может, кто-то знает простой способ получения значащих цифр и степени double? Ибо приходится либо циклом уменьшать/увеличивать число десятками и считать степень, либо использовать преобразование числа в строку, с последующим разбиением ее по 'E' и парсингом, что при этом, не исключает надобности первого варианта.
UPD:
В результате тестирования и обсуждения выяснилось следующее:
2. Решается только через созданный новый тип.
1. Собственный тип не поможет. При обратной конвертации все вернется назад. Но откуда растут ноги проблемы выяснить удалось.
Дело в том, что эти числа в двоичной записи различаются всего на 1 бит. И хоть ты тресни, но среднего значения никогда не получишь.
Пример:
x1 = 0.00000000000000030426102110965129;
Получив массив байт значения имеем:
119 95 82 12 160 236 181 60
x2 = 0.00000000000000030426102110965134;
Аналогично:
120 95 82 12 160 236 181 60
Что делать в такой ситуации абсолютно не понятно.