我现在试图解决的问题涉及计算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