使用 UInt128 数据类型时 Julia 中的大整数除法错误
Large Integer division error in Julia when using UInt128 data type
当我除以 UInt128 类型的大整数时,我得到了错误的结果。错误似乎发生在同一地点,有效数字明智,float64 将舍入其结果。使用一些简单的东西,比如除以 2,我可以很容易地验证我没有得到正确的答案。此外,我还可以使用 BigInt 类型来验证我在使用 UInt128 变量时确实看到了明显的数字错误。
我对 Julia 还是很陌生,对该语言的内部工作原理还不够熟悉,不知道为什么会这样,也不知道什么时候会出现这些结果。有人可以给我一些关于 why/how 这正在发生的见解吗?
例如:
xb::BigInt = big"40282366920938463463374607431768211456"
ub::BigInt = big"2"
xu::UInt128 = parse(UInt128,"40282366920938463463374607431768211456")
uu::UInt128 = parse(UInt128, "2")
println("Initial value for xb = " , xb)
println("Initial value for xu = " , xu)
gb::BigInt = xb / ub
gu::UInt128 = xu / uu
g1::UInt128 = UInt128(40282366920938463463374607431768211456) / UInt128(2)
g2 = UInt128(40282366920938463463374607431768211456) / UInt128(2)
println("Division result using BigInt = ", gb)
println("Division result using UInt128 variables = ", gu)
println("Division result using UInt128 typecasts = ", g1)
println("Division result using UInt128 julia decides = ", g2)
println(typeof(g2))
输出:
julia> include("uint128_test.jl")
Initial value for xb = 40282366920938463463374607431768211456
Initial value for xu = 40282366920938463463374607431768211456
Division result using BigInt = 20141183460469231731687303715884105728
Division result using UInt128 variables = 20141183460469232747289327097010454528
Division result using UInt128 typecasts = 20141183460469232747289327097010454528
Division result using UInt128 julia decides = 2.0141183460469233e37
Float64
Julia 中的整数除法提升到 Float64
。您想使用 div
或 ÷
进行整数除法。
对于这个非常简短的版本,3/2 = 1.5
当我除以 UInt128 类型的大整数时,我得到了错误的结果。错误似乎发生在同一地点,有效数字明智,float64 将舍入其结果。使用一些简单的东西,比如除以 2,我可以很容易地验证我没有得到正确的答案。此外,我还可以使用 BigInt 类型来验证我在使用 UInt128 变量时确实看到了明显的数字错误。
我对 Julia 还是很陌生,对该语言的内部工作原理还不够熟悉,不知道为什么会这样,也不知道什么时候会出现这些结果。有人可以给我一些关于 why/how 这正在发生的见解吗?
例如:
xb::BigInt = big"40282366920938463463374607431768211456"
ub::BigInt = big"2"
xu::UInt128 = parse(UInt128,"40282366920938463463374607431768211456")
uu::UInt128 = parse(UInt128, "2")
println("Initial value for xb = " , xb)
println("Initial value for xu = " , xu)
gb::BigInt = xb / ub
gu::UInt128 = xu / uu
g1::UInt128 = UInt128(40282366920938463463374607431768211456) / UInt128(2)
g2 = UInt128(40282366920938463463374607431768211456) / UInt128(2)
println("Division result using BigInt = ", gb)
println("Division result using UInt128 variables = ", gu)
println("Division result using UInt128 typecasts = ", g1)
println("Division result using UInt128 julia decides = ", g2)
println(typeof(g2))
输出:
julia> include("uint128_test.jl")
Initial value for xb = 40282366920938463463374607431768211456
Initial value for xu = 40282366920938463463374607431768211456
Division result using BigInt = 20141183460469231731687303715884105728
Division result using UInt128 variables = 20141183460469232747289327097010454528
Division result using UInt128 typecasts = 20141183460469232747289327097010454528
Division result using UInt128 julia decides = 2.0141183460469233e37
Float64
Julia 中的整数除法提升到 Float64
。您想使用 div
或 ÷
进行整数除法。
对于这个非常简短的版本,3/2 = 1.5