Types Julia中的大宽度整数?

Types Julia中的大宽度整数?,types,numbers,julia,Types,Numbers,Julia,Julia的整数数据类型在Julia本身中定义为bitstype,所以我可以定义类似于Int256的东西,让Julia处理大于Int128的整数文本,并将它们用作Int256吗 嗯,有一种BigInt类型可以是任意大小。你可以在文档中阅读。我发现,如果你用它做大量的计算,将会有很大的性能损失 除此之外,您当然可以定义自己的类型。我认为其中的一个挑战是,Julia使用的其他语言(如C)中的所有底层库都不支持这么大的整数。例如,当我研究BigFloat类型的问题时,我在Julia的GitHub上发现

Julia的整数数据类型在Julia本身中定义为bitstype,所以我可以定义类似于Int256的东西,让Julia处理大于Int128的整数文本,并将它们用作Int256吗

嗯,有一种
BigInt
类型可以是任意大小。你可以在文档中阅读。我发现,如果你用它做大量的计算,将会有很大的性能损失


除此之外,您当然可以定义自己的类型。我认为其中的一个挑战是,Julia使用的其他语言(如C)中的所有底层库都不支持这么大的整数。例如,当我研究
BigFloat
类型的问题时,我在Julia的GitHub上发现了以下信息。

嗯,有一种
BigInt
类型可以是任意大小。你可以在文档中阅读。我发现,如果你用它做大量的计算,将会有很大的性能损失


除此之外,您当然可以定义自己的类型。我认为其中的一个挑战是,Julia使用的其他语言(如C)中的所有底层库都不支持这么大的整数。例如,当我研究
BigFloat
类型的问题时,我发现Julia的GitHub上的以下内容非常有用。

您可以对任意大小的整数使用
BigInt
,但这会导致性能下降。如果使用固定大小的较大整数并定义快速规则(通过查找表或类似整数的方式),则肯定可以加快速度。您可以通过定义BitStype来使用它,并在BitStype上定义适当的操作

为了加快运算速度,您需要尝试使用处理器中内置的整数运算来提高运算速度,然后以某种方式补偿额外的大小(DoubleDouble.jl就是这样做的)。您总是可以一点一点地定义操作,但这很可能不会像插入处理器上现有的整数加法电路那样快。要使这项工作正确进行,必须进行一些数学/算法工作


理论上(通过浮点数示例判断:DoubleDouble、ArbFloat、ArbReals、各种UNUM等),您可以在Julia中完成所有这些,并将其作为一个包发布。我只是不知道有谁已经这么做了。

您可以对任意大小的整数使用
BigInt
,但这会导致性能下降。如果使用固定大小的较大整数并定义快速规则(通过查找表或类似整数的方式),则肯定可以加快速度。您可以通过定义BitStype来使用它,并在BitStype上定义适当的操作

为了加快运算速度,您需要尝试使用处理器中内置的整数运算来提高运算速度,然后以某种方式补偿额外的大小(DoubleDouble.jl就是这样做的)。您总是可以一点一点地定义操作,但这很可能不会像插入处理器上现有的整数加法电路那样快。要使这项工作正确进行,必须进行一些数学/算法工作


理论上(通过浮点数示例判断:DoubleDouble、ArbFloat、ArbReals、各种UNUM等),您可以在Julia中完成所有这些,并将其作为一个包发布。我只是不知道有谁已经这么做了。

我会回答这个问题:如果不攻击朱莉娅本身,这是不可能的。确切地说,解析器只知道内置的整数类型。对文本的
Int128
支持实际上是在解析器中硬编码的:

(if (and (integer? n) (> n 9223372036854775807))
    `(macrocall @int128_str ,s)
    n)
因此,如果不改变语言本身,就不可能对文字进行任何处理。好吧,假设我们放弃文字支持。我们能至少制作一个
Int256
类型并让它正常工作吗?当然,但这并不像你想象的那么容易

它如此棘手的原因是:在内部,base Julia具有实现大多数整数功能的
bitineger
bitsunsigned
BitSigned
类型。但是,这些类型不能扩展,因为它们是并集而不是抽象类型。例如,我们可以看到
&
在何处以及如何实现:

julia> @which 0x1 & 0x2
&{T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}}(x::T, y::T) at int.jl:141
julia>@哪个0x1和0x2

&{T我将回答这个问题:如果不攻击Julia本身,这是不可能的。准确地说,解析器只知道内置的整数类型。
Int128
对文本的支持实际上是在解析器中硬编码的:

(if (and (integer? n) (> n 9223372036854775807))
    `(macrocall @int128_str ,s)
    n)
因此,如果不改变语言本身,就不可能实现对文字的要求。好吧,假设我们放弃文字支持。我们至少可以制作一个
Int256
类型并使其正常工作吗?当然,但这并不像你想象的那么容易

之所以如此棘手:在内部,base Julia具有实现大多数整数功能的
bitineger
bitsunsigned
BitSigned
类型。但是,这些类型不能扩展,因为它们是并集而不是抽象类型。例如,我们可以看到
在何处以及如何实现教育署:

julia> @which 0x1 & 0x2
&{T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}}(x::T, y::T) at int.jl:141
julia>@哪个0x1和0x2

&{T是的,您可以。可能最简单的方法是使用BigInt作为起点,为GMP库制作您自己的包装器(我实际上一直在为MPFR开发更好、更快、线程安全的包装器,以取代BigFloat,添加更大的固定大小浮点类型和可变的大浮点“容器”类型)。
您还可以覆盖宏int128\u str、uint128\u str和big\u str的定义,以处理文字的转换,因此这甚至不会成为问题(除了加载包时关于替换Base的恼人警告。@int128\u str等。

可以。这可能是最简单的方法