欢迎光临散文网 会员登陆 & 注册

ClassWiz QR功能分析与内部数据存储原理

2023-09-02 22:59 作者:fx999CNCW  | 我要投稿

卡西欧在2014年推出ClassWiz系列计算器,首次在函数机上实现了QR码(二维码)显示,扫描后将跳转到卡西欧的WES网站,在上面可以用导出的数据来绘制函数图像、直方图等图表,实现了函数机+手机=图形机的创新。

QR功能最初只在ClassWiz旗舰型号上搭载,后续被下放到各非旗舰型号,但国内的机型始终与该功能无缘。因此,国内对该功能的分析不是很多,仅在部分ClassWiz评测贴有所涉及。本文将尝试对该功能及其所编码的内容含义做一个较为系统的分析和介绍,有不足之处欢迎批评指正。

QR功能介绍

在正式对QR编码数据的解析前,先介绍一下ClassWiz QR功能的使用。执行相应的按键操作,如果所处界面是支持生成QR的,则会在屏幕中央显示一个二维码,否则也不会有任何报错提示。

当所导出的数据过大时,数据会被“分割”成多个QR码,右下角的数字显示了当前是第几个和一共有几个QR码。按下[↓]、[=]、[EXE]或[OK]可以按顺序显示剩余的QR码,不能按[↑]返回前一个QR码,但可以循环显示。

QR码分割是QR码ISO标准的一部分,在创建分割的QR码序列时,单个QR码除了编码分割到该部分的数据外,还会编码该QR码所在的次序和总数。我们日常使用的扫码软件几乎没有适配这种分割QR码的实现,只会扫描出单个QR码的数据,这种情况下就要按顺序扫码并手动合并数据。卡西欧有专门的扫码软件适配了该标准,在扫码时也会有相应提示,可直接得到完整的扫码结果。

设置里可以设置QR码显示的“版本”,支持设置为“版本11”和“版本3”,默认是版本11。“版本”是QR码规范中的术语,在ClassWiz上,可以理解成版本3的QR码元更大,也就更容易被扫码,但单个QR承载的信息也就越小。故同样的数据,使用版本3就需要分割成更多QR码。然而在QR码标准中,分割数据时最多只支持分割成16个QR码,因此,若数据量过大,版本3的QR码将无法显示,会提示“不支持版本3”。


在显示QR码时,CW I和CW II都支持使用[←][→]键调整对比度,此处设置的对比度值是独立于其它界面的,重置计算器也会保留。CW II还在右下角增加了可调整对比度的提示图案。

除此之外,QR码显示时按下[5]可以使得QR码的掩模(Mask)样式发生变化,ClassWiz说明书中从未提到这一点。QR码的实现规范中定义了8种不同的掩模图案,主要是为了防止QR图样中出现大片的白色或黑色块,以提升可读性。

QR编码内容概述

QR功能介绍完毕,下面看看QR是怎么编码数据的。以一台fx-JP900CW在处于模式菜单、光标位于“基本計算”模式时得到的QR为例,扫码后得到的结果为:

http://wes.casio.com/ncal/index.php?q=I-031A+U-000000000000+M-X100000000+S-1A93A

可以看到是一个链接,主机名是http://wes.casio.com。这是卡西欧的“全球教育服务网站”(Worldwide Education Service),在2022年以前,是由该网站后端处理编码后的计算数据,并返回显示。2022年后,卡西欧升级了该服务,访问该链接将302重定向到classpad.net的网站,可在上面使用更丰富的计算功能。

如果是CW I系列,链接中的域名后面接的是/math,而CW II则是/ncal,可能是new calculator的缩写。再后面接的都是/index.php?q=......了,q=后面的内容就是导出的计算数据。

数据分为多个部分,每个部分之间用+号连接;不同部分的标识符用一个大写字母表示,标识符和存储数据之间用-号连接。根据生成QR时计算器所处的状态,会有相应部分的数据所体现。经过分析,对不同标识符的数据初步解释如下:

下面是对各部分数据更详细的介绍

I数据

I数据存储了该计算器的内部型号,即自检时所显示的代号,以及ROM版本。如243F则表示CY-243 VerF。这里插一个彩蛋,CW I说明书中有一个QR码的示例截图,扫码得到的I数据是23B-。不同机型的字符表会略有不同,例如欧洲型号的小数点是逗点,反三角函数用Arc开头来表示等等,需要得知该机型的型号来确定字符表。

U数据

计算器在工厂刷入ROM的同时还写入了序列号,长度12位。据推测序列号存储了机器所生产的工厂、流水线等信息,但更具体的编码规则尚不明确。

M数据

模式代码(1~4)

当处于正常的运算界面时,1~2位代表所处的主模式,3~4位为子模式。例如计算模式无子模式,则为C100;在统计模式下的“单变量计算”子模式,则为0301。

下表列出了没有子模式的模式代码和对应名称。

下面几个表给出了各模式代码和子模式代码所对应的含义。

基数模式

统计模式。其中,部分机型的“线性回归”和“二次回归”采用幂降序而不是幂升序。

正态分布模式

方程模式,其中子模式08为“Solver 求解方程”,是CW II新增的。

比例鸡肋模式

不等式模式。其中,子模式代码用来指代多项式方程的次数,不等式的符号还需要使用M数据中的7~8位来确定。例如M-4B04DD0100就表示ax²+bx+c<0

结果区模板(5~6)

M数据的5~6位用来指示结果区显示的模板样式,例如计算Rec(r,θ)的结果有两部分x=a,y=b,则使用11指代。

其中,13用在SOLVE的求解界面中,对于求解的目标变量,需要用M数据的最后2位来指代,是求解变量字符对应的16进制码。例如若结果是x=a,L-R=b,是对x求解,这2位就为48(CW II中为47)。

对于其他值,默认视为复数的代数形式a+bi。即使临时转换成极坐标形式r∠θ(CW I中使用▸r∠θ或者CW II中使用格式菜单转换),也不会在QR的M数据中导出指明。如果设置了默认为极坐标格式显示,则要查看S数据。

数值显示格式(7~8)

第7位用来指示结果区数值的显示格式,第8位指示其存储在变量中的格式。例如,若7~8为AD,则表示结果需要显示为小数,但可以转换成标准结果显示。

其中,对于工程记数法的显示,第1次按下[ENG]后,小数点将尝试右移,直到×10的指数是3的倍数,若已经是了则不会移动。继续按[ENG]则继续右移,最多只能右移4次。[SHIFT][ENG]也一样,只不过是左移小数点。CW II中引入了[←][→]键移动小数点的功能,原理类似。

非计算画面

若是处于报错界面、模式菜单、设置菜单生成的QR,则前2位将是对应的报错或菜单代码,此时访问该链接将跳转到对应的说明书页面。

S数据

S数据的长度一般为28个字符,存储了计算器的设置数据,如角度单位等。

下表给出了不同位置字符所对应的设置名称,以及不同参数值所对应的设置项。

内部数值存储原理

计算器内部使用类似于BCD码(Binary-Coded Decimal)的方式来存储数值,从ES到CW I系列都是使用了10个字节(即20位数)来存储,CW II由于精度提升用上了14字节(28位数)来存储,但两者存储的方式并没有根本性的变化。

部分从QR中导出的数据,例如R数据,也将计算器内部存储的数值按16进制原样导出,但格式有所改动。

下面先以10字节20位数的存储方式为例,先看看它在计算器内部是怎么存储的,再说说它和导出数据的异同。

当数值为0时,此时20位数全部是0。

若不为0,以1.23456789112345%5Ctimes10%5E%7B67%7D为例,该数值在计算器内部将存储成如下形式:

浮点数格式

浮点数格式的标志位(区域①)为0。计算器在存储一个数值时,会把它截取15位有效数字,并写成科学计数法的形式,且整数部分只有1位,将其存储到区域②。若科学计数法的指数>0,则区域③直接存储该指数,此时若数值本身>0,则区域④取01,否则取06;若科学计数法的指数<0,则用区域③的是指数的反码,即100-|指数|的值,此时若数值本身>0,则区域④取00,否则取05。

下面举几个例子方便理解

分数格式

分数格式的标志位为2。存储分数时,若该分数的绝对值<1,则将分数线用A表示,按照 分子A分母 的形式存储到区域②中,不足15位后面用0补齐。若分数的绝对值>1,则需要化为带分数,然后存储为 整数A分子A分母 的形式,同样用0补足15位,这实质和分数的线性输入表示一样。区域③为该分数的“长度”,具体下面举例说明。区域④为分数的符号,若为正数则取01,负数取06。


正常情况下,分数的长度不能超过10,若运算超了就会被转换成浮点数存储,且无法化回去。这也是为什么一些看似没有超过计算范围的分数,依然被用小数来表示了,很有可能是因为该数用假分数表示长度没有大于10,但是用带分数表示长度却超过了10。如果通过异常或者使用内存修改器修改模拟器中对应变量的值,还是能够显示出来的。

度分秒格式

度分秒格式的标志位为4。

此时它采用和浮点数一样的存储方式,只不过计算器在显示时默认将其转换成度分秒格式显示。

根式格式

根式格式的标志位为8。计算器最多可以表示2个不同的根式相加,可称之为根式1和根式2。每个根式下最多3位数,根式的系数为分数,分子分母最多2位数,两个分母可以不同,在显示时会通分显示。


ERROR值

错误值的标志位为F。正常情况下是不会在变量中存储ERROR值的,要制造一个ERROR值,ES PLUS中有TABLE法,而在CW I中可以先打出下面这个式子,然后按下[CALC][=][=],M会亮起,[AC]。查看M的值已为空,直接调用M得到数学错误。查看内存,M所在内存区域变成了F3开头,而在前面所介绍对M数据的解析中,Y3对应的刚好是数学错误。


若在数据表格模式下,输入=÷,会制造一个语法错误的单元格,使用QR导出后,该单元格对应的数值存储(后文会讲如何查看)是F2开头,刚好M数据中的Y2对应的就是语法错误。

也就是说,尽管F开头的都是ERROR值,但也是有分类的。

其它

实际上,内部存储还会有标志位为6的数据,它相当于一个指针,指向矩阵或向量。由于QR是直接原样导出了矩阵存储的数值,此处不展开叙述。

CW II的数值表示

CW II提升精度到23位,使用14字节28位来存储浮点数,但表示方式没有根本性变化,最后4位数同样是用来存储区域③和区域④。浮点数格式需占满中间的23位区域②,其余的数值格式则用0补齐。

R数据

内部数值的存储原理介绍完毕,下面看看QR功能是如何导出这些数值的。

与内部存储的方式不同的是,QR导出的R数据会将区域③和区域④的位置对调

计算、复数模式

当R数据是在普通计算结果画面导出的,需要将其分成两部分处理,每部分20位数,刚好对应内部存储方式的20位。

如果计算结果比较“简单”,例如一些数值运算结果,此时R数据的第二部分均为0,只有第一部分(前20位)是有用的,可按照上面所述的存储方式进行解析(需要将区域③和区域④的位置对调)。

若计算结果比较“复杂”,计算器采用了两部分来显示,例如Pol、Rec坐标运算,÷R求余运算,复数模式下的虚数结果等,此时需要解析R数据的两部分,并根据M数据中相应的参数,确定两个数值的显示方式。

除了普通计算,在涉及方程、不等式、矩阵、向量等含有多个结果的计算时,R数据的开头会有此数据的存储标志,后面接数值部分,每部分也为20位,具体要根据M数据和R数据开头的存储标志决定各部分数值对应的结果。

方程模式

EQ表示是方程模式下的结果,EQ0表示方程有解。若是EQ1则是“无数解”(Infinite Solution);EQ2则是“无解”(No Solution);EQ4为“无实根”(No Real Roots);若是在求一元三次方程时能够求其对应函数的极大极小值的机型,会以EQ5开头,若不支持则也为EQ0开头。

矩阵、向量

若在矩阵模式下,计算结果为矩阵

%5Cbegin%7Bbmatrix%7D0%261.41421356237309%261.23456789112345%5Ctimes10%5E%7B67%7D%5C%5C-4.56987123%5Ctimes10%5E%7B-6%7D%26%5Cfrac%7B1%7D%7B7%7D%26-%5Cfrac%7B8%7D%7B9%7D%5Cend%7Bbmatrix%7D

R数据将会得到


开头的M表示Matrix,即矩阵;MT就表示MatAns。2和3表示该矩阵是2×3的大小。后面的数值为该矩阵从左至右、从上到下的各数值。

类似的,若为向量(Vector)结果,则为VT开头,即VctAns,但二、三维向量会使用VT02、VT03,而不是VT12、VT13。

不等式

在不等式模式下,也有类似的表达方式:


此时R数据以INxx开头,后面按照对应的abcd的顺序接各数值。

验证模式

验证模式下的R数据只有20位,代表一个值,“真”(True)为1,“假”(False)为0。

Q数据

Q数据是CW II新增的,格式也与R数据类似,由两部分组成,每部分28位,区域③和区域④的位置也要对调。


Q数据仅在普通计算下会导出,方程、矩阵等模式下的多结果仍导出在R数据中。(鉴定为卡西欧懒狗程序员)

C数据

C数据的存储格式和R数据类似,同样是每部分20位,区域③和区域④的位置对调

在处于矩阵、向量模式时,任何运算产生的QR码都会携带C数据,它包含了已定义的矩阵或向量信息。与R数据类似,若开头是MA23就代表MatA,大小是2×3;VA03就是VctA,三维向量。

在处于方程、不等式模式时,C数据代表了输入的方程系数。此时开头没有标志,根据M数据确定方程或不等式的类型,以确定系数的个数。

P数据

在函数表格模式时生成的QR码会携带该数据,表示生成数表的开始值、结束值和步长。数据由三部分组成,每部分9位数,表示方法和R数据的20位数类似,但它均视为浮点数,故去掉了开头的标识符,有效数字只有6位,区域③和区域④的位置同样对调了,并且区域④只保留了后半位(0,1,5或6)。

V数据

在函数表格模式下,若定义的f(x)或g(x)表达式中含有变量,生成的QR就会携带该数据。

格式和P数据类似,长度也为9位,有效数字只有6位。CW I中该数据存储的依次是ABCDEFyM的值,若是CW II则最后一个是z变量的值。

T数据

数据表格模式

与之前矩阵等模式下会按顺序导出所有数值不同,数据表格导出的QR码只携带了写入有数据单元格的值,这是通过编码了单元格的写入情况实现的。

数据表格的T数据以SP开头,随后接60位的单元格标识符数据,用以标识哪一个单元格是有值的。该标识符数据采用了2进制转16进制的方式来压缩,顺序是先列后行。

例如,若A列的第1,3,4行有数据,从上至下,写入了数值用1表示,没有写入用0表示,此时得到1011_%7B(2)%7D,即B_%7B(16)%7D,于是得到T数据的前3位为SPB。以此类推,得到剩余单元格的数值写入情况,并转换成16进制表示。

由于每一列有45行数据,计算器使用了12个字符来完整表示一列(第45行单元格的写入数据与否,将使得最后一个字符要么是0000_%7B(2)%7D%3D0_%7B(16)%7D,要么是1000_%7B(2)%7D%3D8_%7B(16)%7D)。一共有5列单元格,因此使用了60个字符作为单元格的标识。这60个字符后面接的,就是已写入数据的单元格的数值了。

也就是说,将SP后面的60个字符按每12个分割,将其转换为2进制,不足48位的在前面补上0,然后去掉最后3位,得到的45个数字就依次代表了每一列45个单元格的数据写入情况

在数据表格模式下是不能导出公式的,导出的数据只有数值,格式与P数据类似,有效数字也只有6位。如果公式产生了ERROR,则导出的对应单元格的数据为Fx开头,对应各自的ERROR类型。

统计、分布、数学盒模式

在这些模式下,导出的是统计列表里的数据,数值格式也类似P数据,有效数字只有6位,理应占用9个字符。

但此时的T数据采用了压缩存储,将9字符按照每3个分割,视为10进制数,然后转换为32进制,这样它的位数就减少到了2位,一个数值的占用就从原先的9个字符减少到6个。

例如,1.23456%5Ctimes10%5E%7B78%7D写成P数据的格式将是 123456178,而

123_%7B(10)%7D%3D3R_%7B(32)%7D%0A%5C%5C%0A456_%7B(10)%7D%3DE8_%7B(32)%7D%0A%0A%5C%5C%20%0A178_%7B(10)%7D%3D5I_%7B(32)%7D

则该数值将被表示为 3RE85I

反过来,将编码后的T数据每2位分割,视为32进制数,转换为10进制数,再依次拼接,即可得到了原始的数值存储格式。

数据的导出顺序是先行后列,需要根据M数据确定列的个数(x列、y列和频数)。

表达式字符原理

在输入表达式时,每一个字符在计算器内部都有对应的存储方式,它们的映射关系就是我们熟知的“一级字符表”。ClassWiz系列开始引入了双字节字符,一般高位FA、FB、FD、FE,低位01-EF的部分取值才是有意义的字符。因此每个字符占用1个或2个字节来存储。

若是线性输入的格式,只需将各16进制字符在字符表中查找并替换,即可转换为可读的字符。但在数学输入的情况下,还要对自然书写模板做特殊处理。

目前ClassWiz已有的自然书写符号模板有14种,其中循环小数依据不同地区的习惯做了调整,有3种表示方法。


上表模板符号中的XX、YY、ZZ依次对应源码的相应位置,可以嵌套。源码中1A、1B和1D、1E可以看做成对的括号();1C则类似于逗号,或者说),(;1F比较特殊,只与带分数的18配合使用。

算法命令存储原理

在算法模式中,使用的是高位为F9的字符来存储命令。

TI-Planet上整理了一份fx-92+ Spéciale Collège所使用的字符与对应命令的映射:

命令中可以编辑的区域,存储的是原样输入的表达式,并使用00来作为单条命令中数据输入的终止符。

命令数据并不存储在输入区域(第一缓冲区),而是在内存区域相对靠后的一块地方。

E数据、G数据

在算法以外的模式时,导出的E数据就是当前的输入区字符的16进制,原样导出,没有变化。

在算法模式时,则是将命令的源码原样导出在E数据中。

G数据则是在函数表格模式时,导出的g(x)的表达式。

参考资料

  1. 【991+无聊教程】使Ans=2/0,开机可保留 & 原理. https://tieba.baidu.com/p/1899977141

  2. 【技术】内部数值存储研究. https://tieba.baidu.com/p/2793407170

  3. 【ClassWiz联测】卡西欧旗舰型号991CNX/JP900/991DEX/991SPX对比. https://tieba.baidu.com/p/3894270548

  4. Classwiz/fx-92+SC tokens encoding. https://tiplanet.org/forum/viewtopic.php?f=27&t=21662



ClassWiz QR功能分析与内部数据存储原理的评论 (共 条)

分享到微博请遵守国家法律