我目前试图解决的问题涉及计算 10 模(n)的顺序,其中 n 可以是小于 1000 的任何数字。我有一个函数可以做到这一点,但是,我无法获得准确的结果随着订单价值的增加。
只要订单足够小,该函数就可以正常工作,但对于大订单返回不正确的值。所以我坚持在终端的一些输出中定位问题,并发现当我使用幂运算时,我的实数的准确性受到了损害。
我在函数中声明了所有变量,并在程序中将其作为 real(kind=nkind) 进行了测试,其中 nkind = selected_real_kind(p=18, r=308)。任何显式引用的数字也被声明为,例如,1.0_nkind。但是,当我打印出 10**n for 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