首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >J的x类型变量:它们是如何在内部存储的?

J的x类型变量:它们是如何在内部存储的?
EN

Stack Overflow用户
提问于 2014-06-11 17:44:34
回答 1查看 171关注 0票数 6

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

任何帮助都会被感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 10:40:24

简而言之:J的扩展精度整数存储在 中。

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

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

代码语言:javascript
复制
123456 7890123 456789012x

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

代码语言:javascript
复制
   1e4 #.^:_1&.> 123456 7890123 456789012x
+-------+-------+-----------+
|12 3456|789 123|4 5678 9012|
+-------+-------+-----------+

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

代码语言:javascript
复制
   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以10000为基数存储大数?这是因为10,000足够大来保持嵌套数组的紧凑,并且是10的幂表示makes it easy to format numbers in decimal

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24159654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档