我在划分大数时遇到问题。我有一个 while 循环,如果索引在数组限制内并且其余数为零,则将数字除以:
while ((i + j*arr[i]) <= lim && arr[i + j*arr[i]] % arr[i] == 0)
arr[i + j*arr[i]] /= arr[i]
end
Run Code Online (Sandbox Code Playgroud)
我在最大值为 Int64 的数组上使用arr[i]<(150*10^6)^2
,即使更改为 Int128 也无济于事,BigInt 是不可能的,因为它需要太多时间。我不明白为什么只有在余数为零时才进入循环,我会在循环内得到 Inexact 错误。而typemax(Int64)>max(arr)
这里是完整的错误:
InexactError: Int64(1.8014400929875968e15)
in top-level scope at P-146-Investigating a Prime Pattern:51
in test at P-146-Investigating a Prime Pattern:39
in setindex! at base\array.jl:826
in convert at base\number.jl:7
in Int64 at base\float.jl:710
Run Code Online (Sandbox Code Playgroud)
似乎只有在数组中的值高于之后才会发生 (90*10^6)^2
TLDR:使用÷
.
使用/
Julia 中的函数对整数进行除法会返回浮点数。重要的是,它在进行除法之前将整数提升为浮点数。例如,这个数显然可以被 3 整除:10^16-1
julia> 9999999999999999 % 3
0
Run Code Online (Sandbox Code Playgroud)
但是,如果我们尝试用 来做这个除法/
,我们不会得到正确的答案:
julia> 9999999999999999 / 3
3.3333333333333335e15
julia> using Printf
julia> @printf "%f" 9999999999999999 / 3
3333333333333333.500000
Run Code Online (Sandbox Code Playgroud)
因此,当然,尝试将上述数字存储在整数数组中会引发不精确的错误。但这是为什么呢?那么你在上面maxintfloat(Float64)
。由于浮点数具有约 15 位十进制数字的精度,高于此值它们不再能够准确表示每个整数。他们开始跳过(并舍入!)它们。因此,您并不是真的除以10^16-1
三,而是将 10^16 除以三!
julia> 10^16-1
9999999999999999
julia> Float64(10^16-1)
1.0e16
Run Code Online (Sandbox Code Playgroud)
更好地使用÷
(即div
)——它不仅可以处理这些情况而不必担心浮点精度,而且它还可以将事物保留为整数:
julia> 9999999999999999 ÷ 3
3333333333333333
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
256 次 |
最近记录: |