📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程
浮点长什么样:一个数占两个格子,单看像乱码
0:33浮点:一个数占两个寄存器
- 一个数占两格浮点数在机器里就占两个寄存器格子,跟整数不一样
- 分开看像乱码低字 52429、高字 16844,得拼起来才认得出是 25.6
- 手册提醒过看浮点要用自由监控,把监控格式选对
- 整数也能转FLT 把整数二十五转成同一个浮点格式,拼出来是 25.0
同一个 25.6:浮点要占两格
先看浮点长什么样。第一条把二十五点六送进 D10 开头两个格子:低字是五万二千四百二十九,高字是一万六千八百四十四。分开看像乱码,合起来正好二十五点六。手册专门提醒过,看浮点要把监控格式选对,用自由监控。第二条 FLT 把整数二十五转过来,也占 D20 开头两个格子,拼出来就是二十五点零。记住一句:浮点一个数占两个寄存器,谁也别跟它抢格子。
为什么要先转:不转就直接除,小数被丢掉
0:31不转就除:小数被丢掉
- 整数除法只给商和余数七除以三,只拿到商二和余数一
- 小数被丢掉小数点后面机器直接不要了,这是整数指令的通病
- 想留小数先转浮点把两个数都转成浮点,再用浮点除法
- 手册那张图EDIV 相除得 2.3333,手册讲浮点配的就是这张
不转就除:小数被丢掉
先弄清一件事:为什么算之前要先转一下。图上第一条是整数除法,七除以三,D20 只拿到商二,D21 拿到余数一,小数点后面全被丢掉。这是整数指令的通病。想留住小数,就得先把两个数都转成浮点。图上先把 D0 的七和 D2 的三各自转成浮点,再用 EDIV 相除,结果二点三三三三就留住了。手册里讲浮点那一节,专门配的就是这张图。
浮点四则:加、减、乘、除,名字多一个 E
0:39浮点四则:名字多个 E
- 名字多一个字母加 E:EADD、ESUB、EMUL、EDIV
- 四条挨着算十出发:加 2.5 得 12.5、减得 7.5、乘得 20、除得 5
- 结果各占两格四条结果分别在 D20、D30、D40、D50 开头
- 排紧会互相冲每个结果占两个字,格数不够会冲掉上一条的高字
浮点四则:名字多个 E
四则运算的浮点版,就是在指令名字前面多一个 E:EADD、ESUB、EMUL、EDIV。图上先把 D0 的十转成浮点,接下来四条依次算:加二点五得十二点五,减二点五得七点五,乘二点零得二十,除二点零得五。写法、操作数位置跟整数版一样。要注意的还是占格子:四条结果分别住在 D20、D30、D40、D50 开头,每条都占两个格子,往后排一格都不能省,不然下一条会冲掉上一条的高字。
坑:整数直接当浮点比,判成了小于
0:37坑:整数当浮点比
- 先看坑在哪ECMP 按浮点格式比,前一句却是普通整数存法
- 读出来极小位对不齐,读出来是 1.73 乘十的负四十二次方
- 判成了小于本该相等的两个数,成了小于
- 结论是错的输出灯亮了,可这次比较的结论本身是错的
坑:整数当浮点比
接下来看一个坑。浮点比较 ECMP,是把两个操作数按浮点格式比大小。图上第一条用 MOV 把整数一千二百三十四放进 D10,这只是普通整数存法;第二条 ECMP 却把它当浮点读。整数的位对不上浮点的位置,读出来是个极小的数,一点七三乘十的负四十二次方。于是本来相等的两个数,被判成了小于。三盏结果灯里,只有低位那盏亮,等于和大于都不亮。送输出那路取的就是小于,灯就亮了,可它是错的。
正解:先转成浮点再比,EZCP 连填反都有明文规定
0:40正解:先 FLT,再加 EZCP
- 先转再比FLT 把整数转成浮点,ECMP 才判得对
- 这次判对了判成等于,等于灯和输出灯都亮
- 填反也有规定上限比下限还小时,把上限当下限用,不会两头同时亮
- 改一下就变把下限改成两千,区间变了,等位灯就灭
正解:先 FLT,再加 EZCP
正解是先转成浮点再比。图上第一条 FLT 把 D0 的一千二百三十四转成浮点,第二条 ECMP 就正确判成等于,等于灯和输出灯都亮。下面那条是浮点区间比较 EZCP:D20、D30 存着下限和上限,被比的数落在区间里,等位灯就亮,用法跟上一课的整数 ZCP 一样。区别在填反的时候:手册明文说,上限比下限还小时,就把上限当作跟下限一样来比,所以不会出现两头同时亮。把下限改成两千,等位灯就灭了。
收尾:开方、三角函数要弧度、最后转回整数
0:38开方 + 三角函数 + 转回整数
- 先转再开方FLT 转成浮点,ESQR 开平方得 4
- 角度要先换弧度三十度 × 0.0174533 = 0.5236 弧度
- 三角函数吃弧度换完弧度,SIN 才得 0.5;直接写 SIN K30 会得负 0.988
- 最后转回整数INT 四舍五入把浮点变回整数,结果是一
开方 + 三角函数 + 转回整数
最后把用到的浮点指令串一遍。图上拿整数十六出发,先 FLT 转成浮点,再 ESQR 开平方得四。接着算一个角度:三十度想求正弦,得先乘零点零一七四五三三换成弧度,手册图注写的就是角度乘圆周率再除一百八十。换成弧度之后,SIN 一算得零点五,正是三十度的正弦;直接写 SIN K30 会得负零点九八八,因为机器只认弧度。最后用 INT 把浮点转回整数,小数点后面四舍五入,结果是一。