在什么情况下⎕DR会间歇性地失败?
虽然它已经运行多年了,但我们最近不时从文件中读取二进制数据的系统在⎕DR时崩溃了一个DOMAIN ERROR。
有问题的应用程序代码从本机文件中读取数据,如下所示:
[0] r ← convert data
[1] r ← 0 0 0 0 0
[2] r[1] ← 323 ⎕DR data[1 2 3 4]
[3] r[2] ← 323 ⎕DR data[5 6 7 8]
[4] r[3] ← 645 ⎕DR data[9 10 11 12 13 14 15 16]
[5] r[4] ← 645 ⎕DR data[17 18 19 20 21 22 23 24]
[6] r[5] ← 645 ⎕DR data[25 26 27 28 29 30 31 32]
这是程序崩溃的645⎕DR线之一,以下是导致它最后一次崩溃的原因:
645 ⎕DR ⎕AV[157 43 52 44 1 1 215 96]
另一方面,以下工作:
645 ⎕DR ⎕AV[1 1 1 1 2 71 134 232]
我们使用Dyalog APL版本10.
答案 0 :(得分:3)
否则将包含在
中的浮点值In [16]: peq = {
....: 'sg':{'code':9, 'perror':0},
....: '6e':{'code':17, 'perror':0},
....: 'g8':{'code':25, 'perror':0},
....: 'i7':{'code':33, 'perror':0},
....: '9h':{'code':41, 'perror':0},
....: 'it':{'code':49, 'perror':0},
....: 'ic':{'code':57, 'perror':0},
....: '9w':{'code':65, 'perror':0},
....: 's2':{'code':73, 'perror':0},
....: 'ai':{'code':81, 'perror':0}
....: }
In [17]: import pandas as pd
In [18]: data = pd.DataFrame.from_dict(peq)
In [19]: data
Out[19]:
6e 9h 9w ai g8 i7 ic it s2 sg
code 17 41 65 81 25 33 57 49 73 9
perror 0 0 0 0 0 0 0 0 0 0
In [20]: data.iloc[0]
Out[20]:
6e 17
9h 41
9w 65
ai 81
g8 25
i7 33
ic 57
it 49
s2 73
sg 9
Name: code, dtype: int64
In [21]:
是NaN(非数字),有效载荷值为2.251799834E15或20150831(2015年8月31日??),具体取决于您的查看方式。
据我所知,现在没有现有的APL处理NaNs作为其浮点数组的一部分(IBM 360浮点数没有这个),因此DOMAIN ERROR。
见
https://en.wikipedia.org/wiki/NaN
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
Why does IEEE 754 reserve so many NaN values?
并搜索" Double NaN有效载荷"。
APL提供了一种轻松检查NaN内容的方法。请尝试以下方法:
645 ⎕DR ⎕AV[157 43 52 44 1 1 215 96]
当数字在内存中存储为 little endian 时,⊖是必需的。与维基百科文章中的64位双模式图相比,答案开始有意义。
有效载荷是指数中的任何东西。
⊖ 8 8 ⍴ 11 ⎕DR ⎕AV[157 43 52 44 1 1 215 96]
0 ⍝ sign bit, does not matter for NaN
1 1 1 1 1 1 1 ⍝ 11 bit exponent, should be all 1
1 1 1 1
1 0 0 0 ⍝ the rest is the exponent
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 1 0 0 1 1
0 1 1 1 1 0 1 0
0 0 1 0 1 1 1 1
负和正无穷大是相似的。
创建此数据的软件或语言是什么?