gpt4 book ai didi

python - J的x型变量: how are they stored internally?

转载 作者:太空狗 更新时间:2023-10-29 22:15:58 25 4
gpt4 key购买 nike

我正在用 Python ( https://gist.github.com/Synthetica9/73def2ec09d6ac491c98) 编写一些 J 绑定(bind)。但是,我在处理任意精度整数时遇到了一个问题:输出没有任何意义。每次都是不同的(但一般幅度相同)。相关代码:

def JTypes(desc, master):
newdesc = [item.contents.value for item in desc]
type = newdesc[0]
if debug: print type
rank = newdesc[1]
shape = ct.c_int.from_address(newdesc[2]).value
adress = newdesc[3]
#string
if type == 2:
charlist = (ct.c_char.from_address(adress+i) for i in range(shape))
return "".join((i.value for i in charlist))
#integer
if type == 4:
return ct.c_int.from_address(adress).value
#arb-price int
if type == 64:
return ct.c_int.from_address(adress).value

class J(object):
def __init__(self):
self.JDll = ct.cdll.LoadLibrary(os.path.join(jDir, "j.dll"))
self.JProc = self.JDll.JInit()

def __call__(self, code):
#Exec code, I suppose.
self.JDll.JDo(self.JProc, "tmp=:"+code)
return JTypes(self.deepvar("tmp"),self)

如有任何帮助,我们将不胜感激。

最佳答案

简答:J 的扩展精度整数存储在 base 10,000

更具体地说:单个扩展整数存储为机器整数数组,每个整数都在 [0,1e4) 范围内。因此,扩展整数数组存储为 recursive data structure 。扩展整数数组的类型为 64(“扩展整数”),其元素(每个元素本身(指向)一个数组)的类型为 4(“整数”)。

因此,从概念上讲(使用 J 表示法),大整数数组:

123456 7890123 456789012x

存储为嵌套的机器整数数组,每个整数小于 10,000:

   1e4 #.^:_1&.> 123456 7890123 456789012x
+-------+-------+-----------+
|12 3456|789 123|4 5678 9012|
+-------+-------+-----------+

因此,要恢复原始大数,您必须以 10,000 为基数解释这些数字¹:

   10000x #.&> 12 3456 ; 789 123 ; 4 5678 9012   
123456 7890123 456789012

J 中唯一的其他“x 型变量”是有理数,毫无疑问,有理数存储为扩展精度整数对(一个用于分子,另一个用于分母)。因此,如果您有一个数组,其标题指示 type='rational' 且 count=3,则其数据段将具有 6 个元素 (2*3)。成对地使用这些,你就有了一系列的比率。

如果您正在尝试构建一个完整的 J-Python 界面,您还必须处理同样嵌套的盒装数组和稀疏数组。通过使用 tools built in to J 检查 J 名词的二进制和十六进制表示,您可以学到很多东西。

哦,如果您想知道为什么 J 以 10,000 为基数存储大数?这是因为 10,000 足以使嵌套数组保持紧凑,并且 10 的幂表示 makes it easy to format numbers in decimal


¹ 注意调整字节顺序(例如,4 5678 9012 在内存中可能表示为 9012 5678 4)。

关于python - J的x型变量: how are they stored internally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24159654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com