Точные проблемы с очень большими реалами - Фортран
Проблема, которую я пытаюсь решить на данный момент, заключается в вычислении порядка 10 по модулю (n), где n может быть любым числом меньше 1000. У меня есть функция, позволяющая сделать именно это, однако я не могу получить точные результаты По мере увеличения стоимости заказа.
Функция работает правильно, пока заказ достаточно мал, но возвращает большие значения для больших заказов. Поэтому я попытался найти выход в терминале, чтобы найти проблему, и обнаружил, что, когда я использую возведение в степень, точность моих данных снижается.
Я объявил ВСЕ переменные в функции и в программе, которые я тестировал, как реальные (kind=nkind), где nkind = selected_real_kind(p=18, r=308). Любые числа, на которые имеются явные ссылки, также объявляются, например, как 1.0_nkind. Однако, когда я печатаю 10**n для n, считая от 1, я нахожу, что при 10**27 значение верное. Однако 10**28 дает 9999999999999999999731564544. Все высшие силы искажены аналогичным образом, и эта неточность является источником моей проблемы.
Итак, мой вопрос, есть ли способ обойти ошибку? Я не знаю ни одного способа использовать более высокую точность, чем я уже использую в расчетах.
Спасибо Шон
* РЕДАКТИРОВАТЬ: Там не так много, чтобы увидеть в коде, но здесь вы идете:
integer, parameter :: nkind = selected_real_kind(p=18, r = 308)
real(kind=nkind) function order_ten_modulo(n)
real(kind=nkind) :: n, power
power = 1.0_nkind
if (mod(n, 5.0_nkind) == 0 .or. mod(n, 2.0_nkind) == 0) then
order_ten_modulo = 0
return
end if
do
if (power>300.0) then ! Just picked this number as a safeguard against endless looping -
exit
end if
if (mod(10.0_nkind**power, n) == 1.0_nkind) then
order_ten_modulo = power
exit
end if
power = power + 1.0_nkind
end do
return
end function order_ten_modulo