将Array {Int64}转换为Array {Int32}时检查溢出的方法

莱迪

将Array {Int64}转换为Array {Int32}时,有什么方法可以检查溢出?

julia> x = [0,100,2^50]
3-element Array{Int64,1}:
                0
              100
 1125899906842624

julia> int32(x)
3-element Array{Int32,1}:
   0
 100
   0

我知道一种简单的方法就是检查all(typemin(Int32) .< x .< typemax(Int32))但我正在寻找一种更有效的方法。


编辑:

我试图比较一个专门但不那么优雅的功能g

f(x::Array{Int64, 1}) = all(typemin(Int32) .< x .< typemax(Int32))
function g(x::Array{Int64, 1})
    a = typemin(Int32)
    b = typemax(Int32)
    for z in x
        if !(a<z<b)
            return false
        end
    end
    return true
end
x = convert(Array, (2^31-10000):(2^31));
@time for i in 1:1000; f(x); end
@time for i in 1:1000; g(x); end

事实证明,它g使用的内存更少,因此比f

julia> @time for i in 1:1000; f(x); end
elapsed time: 0.046384046 seconds (13186456 bytes allocated)

julia> @time for i in 1:1000; g(x); end
elapsed time: 0.015128743 seconds (7824 bytes allocated)
瓦特姆

我发现直接检查方法更快。就像您在上面发现的那样,内存使用可能是原因。因此,在这种情况下,您可以将便利性换成运行速度并获得更好的性能。

假设

您只关心将Array {Int64}转换为Array {Int32}是否会出错当该数字> 2 ^ 32时显然就是这种情况。

julia> int32(2^42)
0

但是由于使用2的补码,试图表示大于2 ^ 31-1的任何内容也是一个问题。

julia> x = 2^31 - 1
2147483647

julia> int32(x) == x
true

julia> y = 2^31
2147483648

julia> int32(y) == y
false

比较

我用于比较的2个函数是

function check1(x) 
   all(typemin(Int32) .< x .< typemax(Int32))
end

function check2(x)
   ok = true;
   const min = -2^31
   const max = 2^31 - 1;

   for i = 1:length(x)
      v = x[i]
      if v > max || v < min 
         ok = false;
         break;
      end
   end
   ok
end

结果

check2会更快,因为一旦发现1个错误值,它将立即停止,但是即使在最坏的条件下,它也会更快

julia> z = convert(Array{Int64},ones(10000));


julia> @time for i = 1:1000 check2(z) end
elapsed time: 0.008574832 seconds (0 bytes allocated)


julia> @time for i = 1:1000 check1(z) end
elapsed time: 0.036393418 seconds (13184000 bytes allocated)

点缀

如果使用@inbounds宏,则速度会持续提高大约60%

   @inbounds v = x[i]

新结果

julia> @time for i = 1:1000 check2(z) end
elapsed time: 0.005379673 seconds (0 bytes allocated)

确认

在验证正确性的同时,我偶然发现了这一点

julia> u = [ 2^31 - 2; 2^31 - 1; 2^31 ]
3-element Array{Int64,1}:
 2147483646
 2147483647
 2147483648


julia> for n in u println(check1([n])) end
true
false
false

julia> for n in u println(check2([n])) end
true
true
false

看来check1不正确,2 ^ 31-1可以用32位整数表示。相反,check1应该使用<=

function check1(x) 
   all(typemin(Int32) .<= x .<= typemax(Int32))
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当将Int64强制转换为Int32时,为什么C#让我溢出而没有任何错误或警告,它如何执行强制转换?

来自分类Dev

将dtype从int64转换为int32

来自分类Dev

将所有列从int64转换为int32

来自分类Dev

将dtype从int64转换为int32

来自分类Dev

将uint转换为Int32

来自分类Dev

将盒装 int64 转换为 int

来自分类Dev

将int32转换为其他类型时的精度

来自分类Dev

如何将NSNumber转换/转换为Int64?

来自分类Dev

将__NSCFNumber转换为Int32 Swift

来自分类Dev

将Int32转换为Bool

来自分类Dev

将 Pandas Dataframe 转换为 int32 numpy 矩阵

来自分类Dev

将 int32 转换为 dart 中的字节列表

来自分类常见问题

Golang将字符串转换为int64

来自分类Dev

将[Int64]的Swift数组转换为NSArray

来自分类Dev

将布尔列表转换为_int64

来自分类Dev

将Int64转换为UUID

来自分类Dev

将 DateTimeOffset 转换为 Int64 并返回到 DateTimeOffset

来自分类Dev

无法从方法组转换为Int32

来自分类Dev

类型效率:Array{Int64, 1} 与 LinearAlgebra.Adjoint{ Int64, Array{Int64, 1}}

来自分类Dev

无法根据“安全”将数组数据从dtype('float64')转换为dtype('int32')

来自分类Dev

将Int32.Maximum +值转换为int32

来自分类Dev

为Int32到Int64强制转换生成警告

来自分类Dev

使用int64和int32指针进行困难的转换

来自分类Dev

将字符串验证为Int32或Int64

来自分类Dev

to_dict()将dtype从int32更改为int64

来自分类Dev

Swift错误:无法将'Int32'类型的值转换为预期的参数类型'Int32'

来自分类Dev

LINQ to Entities无法识别方法'Int64 Max(Int64,Int64)',并且该方法无法转换为商店表达式

来自分类Dev

无法在Swift中调用采用int的ObjC方法,因为Int32无法转换为Int

来自分类Dev

Swift:将Int16转换为Int32(或NSInteger)

Related 相关文章

  1. 1

    当将Int64强制转换为Int32时,为什么C#让我溢出而没有任何错误或警告,它如何执行强制转换?

  2. 2

    将dtype从int64转换为int32

  3. 3

    将所有列从int64转换为int32

  4. 4

    将dtype从int64转换为int32

  5. 5

    将uint转换为Int32

  6. 6

    将盒装 int64 转换为 int

  7. 7

    将int32转换为其他类型时的精度

  8. 8

    如何将NSNumber转换/转换为Int64?

  9. 9

    将__NSCFNumber转换为Int32 Swift

  10. 10

    将Int32转换为Bool

  11. 11

    将 Pandas Dataframe 转换为 int32 numpy 矩阵

  12. 12

    将 int32 转换为 dart 中的字节列表

  13. 13

    Golang将字符串转换为int64

  14. 14

    将[Int64]的Swift数组转换为NSArray

  15. 15

    将布尔列表转换为_int64

  16. 16

    将Int64转换为UUID

  17. 17

    将 DateTimeOffset 转换为 Int64 并返回到 DateTimeOffset

  18. 18

    无法从方法组转换为Int32

  19. 19

    类型效率:Array{Int64, 1} 与 LinearAlgebra.Adjoint{ Int64, Array{Int64, 1}}

  20. 20

    无法根据“安全”将数组数据从dtype('float64')转换为dtype('int32')

  21. 21

    将Int32.Maximum +值转换为int32

  22. 22

    为Int32到Int64强制转换生成警告

  23. 23

    使用int64和int32指针进行困难的转换

  24. 24

    将字符串验证为Int32或Int64

  25. 25

    to_dict()将dtype从int32更改为int64

  26. 26

    Swift错误:无法将'Int32'类型的值转换为预期的参数类型'Int32'

  27. 27

    LINQ to Entities无法识别方法'Int64 Max(Int64,Int64)',并且该方法无法转换为商店表达式

  28. 28

    无法在Swift中调用采用int的ObjC方法,因为Int32无法转换为Int

  29. 29

    Swift:将Int16转换为Int32(或NSInteger)

热门标签

归档