非常大的实数的精确问题 - Fortran

时间:2014-04-17 04:49:17

标签: fortran extended-precision

我现在试图解决的问题涉及计算10模数(n)的顺序,其中n可以是小于1000的任何数字。我有一个函数可以做到这一点,但是,我无法随着订单价值的增加,获得准确的结果。

只要订单足够小,该功能就能正常工作,但对大订单返回的值不正确。所以我在终端中输入一些输出来找到问题,并发现当我使用取幂时,我的实数的准确性正在受到损害。

我在函数和程序中声明了所有变量我测试它是真实的(kind = nkind),其中nkind = selected_real_kind(p = 18,r = 308)。显式引用的任何数字也被声明为例如1.0_nkind。但是,当我打印出10 ** 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

0 个答案:

没有答案