1

私が現在取り組もうとしている問題は、10 modulo(n) の次数を計算することです。ここで、n は 1000 未満の任意の数である可能性があります。正確にそれを行う関数がありますが、正確な結果を得ることができません。注文の価値が上がるにつれて。

この関数は、注文が十分に小さい限り正しく機能しますが、注文が多い場合は正しくない値を返します。そのため、問題を特定するために端末への出力をいくつか残しておき、累乗を使用すると実数の精度が損なわれることを発見しました。

関数ですべての変数を宣言し、プログラムで実際の(kind = nkind)としてテストしました。ここで、nkind = selected_real_kind(p = 18、r = 308)です。明示的に参照される数値は、たとえば 1.0_nkind としても宣言されます。ただし、1 から数えて n に対して 10**n を出力すると、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
4

0 に答える 0