第22课 · 小数点也能算(浮点运算)

信捷指令讲堂 · 6 段 · 共 3:37 · 正文 1100 字 · 完全免费

长度、温度、比例都要小数。这节课讲浮点指令怎么写,并解释一个常见现象:为什么浮点数存进 D 之后"看着不对"——那是编码方式,不是算错。

完整课程 · 智慧屏 + 数字人讲师加载较慢?先看下面的图文
正在加载数字人讲师 …
首次打开约需 30~60 秒(3D 模型较大,只在电脑上加载)
加载期间可以先往下看图文讲解
这台设备暂时跑不了完整课程需要支持 WebGL 的浏览器(多数电脑浏览器都支持)
下面是同一节课的图文讲解 + 音频,内容完全一样

📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程

1/6

浮点长什么样:一个数占两个格子,单看像乱码

0:33

浮点:一个数占两个寄存器

  • 一个数占两格浮点数在机器里就占两个寄存器格子,跟整数不一样
  • 分开看像乱码低字 52429、高字 16844,得拼起来才认得出是 25.6
  • 手册提醒过看浮点要用自由监控,把监控格式选对
  • 整数也能转FLT 把整数二十五转成同一个浮点格式,拼出来是 25.0
小数点也能算(浮点运算) · 浮点长什么样:一个数占两个格子,单看像乱码 梯形图 同一个 25.6:浮点要占两格

同一个 25.6:浮点要占两格

先看浮点长什么样。第一条把二十五点六送进 D10 开头两个格子:低字是五万二千四百二十九,高字是一万六千八百四十四。分开看像乱码,合起来正好二十五点六。手册专门提醒过,看浮点要把监控格式选对,用自由监控。第二条 FLT 把整数二十五转过来,也占 D20 开头两个格子,拼出来就是二十五点零。记住一句:浮点一个数占两个寄存器,谁也别跟它抢格子。

2/6

为什么要先转:不转就直接除,小数被丢掉

0:31

不转就除:小数被丢掉

  • 整数除法只给商和余数七除以三,只拿到商二和余数一
  • 小数被丢掉小数点后面机器直接不要了,这是整数指令的通病
  • 想留小数先转浮点把两个数都转成浮点,再用浮点除法
  • 手册那张图EDIV 相除得 2.3333,手册讲浮点配的就是这张
小数点也能算(浮点运算) · 为什么要先转:不转就直接除,小数被丢掉 梯形图 不转就除:小数被丢掉

不转就除:小数被丢掉

先弄清一件事:为什么算之前要先转一下。图上第一条是整数除法,七除以三,D20 只拿到商二,D21 拿到余数一,小数点后面全被丢掉。这是整数指令的通病。想留住小数,就得先把两个数都转成浮点。图上先把 D0 的七和 D2 的三各自转成浮点,再用 EDIV 相除,结果二点三三三三就留住了。手册里讲浮点那一节,专门配的就是这张图。

3/6

浮点四则:加、减、乘、除,名字多一个 E

0:39

浮点四则:名字多个 E

  • 名字多一个字母加 E:EADD、ESUB、EMUL、EDIV
  • 四条挨着算十出发:加 2.5 得 12.5、减得 7.5、乘得 20、除得 5
  • 结果各占两格四条结果分别在 D20、D30、D40、D50 开头
  • 排紧会互相冲每个结果占两个字,格数不够会冲掉上一条的高字
小数点也能算(浮点运算) · 浮点四则:加、减、乘、除,名字多一个 E 梯形图 浮点四则:名字多个 E

浮点四则:名字多个 E

四则运算的浮点版,就是在指令名字前面多一个 E:EADD、ESUB、EMUL、EDIV。图上先把 D0 的十转成浮点,接下来四条依次算:加二点五得十二点五,减二点五得七点五,乘二点零得二十,除二点零得五。写法、操作数位置跟整数版一样。要注意的还是占格子:四条结果分别住在 D20、D30、D40、D50 开头,每条都占两个格子,往后排一格都不能省,不然下一条会冲掉上一条的高字。

4/6

坑:整数直接当浮点比,判成了小于

0:37

坑:整数当浮点比

  • 先看坑在哪ECMP 按浮点格式比,前一句却是普通整数存法
  • 读出来极小位对不齐,读出来是 1.73 乘十的负四十二次方
  • 判成了小于本该相等的两个数,成了小于
  • 结论是错的输出灯亮了,可这次比较的结论本身是错的
小数点也能算(浮点运算) · 坑:整数直接当浮点比,判成了小于 梯形图 坑:整数当浮点比

坑:整数当浮点比

接下来看一个坑。浮点比较 ECMP,是把两个操作数按浮点格式比大小。图上第一条用 MOV 把整数一千二百三十四放进 D10,这只是普通整数存法;第二条 ECMP 却把它当浮点读。整数的位对不上浮点的位置,读出来是个极小的数,一点七三乘十的负四十二次方。于是本来相等的两个数,被判成了小于。三盏结果灯里,只有低位那盏亮,等于和大于都不亮。送输出那路取的就是小于,灯就亮了,可它是错的。

5/6

正解:先转成浮点再比,EZCP 连填反都有明文规定

0:40

正解:先 FLT,再加 EZCP

  • 先转再比FLT 把整数转成浮点,ECMP 才判得对
  • 这次判对了判成等于,等于灯和输出灯都亮
  • 填反也有规定上限比下限还小时,把上限当下限用,不会两头同时亮
  • 改一下就变把下限改成两千,区间变了,等位灯就灭
小数点也能算(浮点运算) · 正解:先转成浮点再比,EZCP 连填反都有明文规定 梯形图 正解:先 FLT,再加 EZCP

正解:先 FLT,再加 EZCP

正解是先转成浮点再比。图上第一条 FLT 把 D0 的一千二百三十四转成浮点,第二条 ECMP 就正确判成等于,等于灯和输出灯都亮。下面那条是浮点区间比较 EZCP:D20、D30 存着下限和上限,被比的数落在区间里,等位灯就亮,用法跟上一课的整数 ZCP 一样。区别在填反的时候:手册明文说,上限比下限还小时,就把上限当作跟下限一样来比,所以不会出现两头同时亮。把下限改成两千,等位灯就灭了。

6/6

收尾:开方、三角函数要弧度、最后转回整数

0:38

开方 + 三角函数 + 转回整数

  • 先转再开方FLT 转成浮点,ESQR 开平方得 4
  • 角度要先换弧度三十度 × 0.0174533 = 0.5236 弧度
  • 三角函数吃弧度换完弧度,SIN 才得 0.5;直接写 SIN K30 会得负 0.988
  • 最后转回整数INT 四舍五入把浮点变回整数,结果是一
小数点也能算(浮点运算) · 收尾:开方、三角函数要弧度、最后转回整数 梯形图 开方 + 三角函数 + 转回整数

开方 + 三角函数 + 转回整数

最后把用到的浮点指令串一遍。图上拿整数十六出发,先 FLT 转成浮点,再 ESQR 开平方得四。接着算一个角度:三十度想求正弦,得先乘零点零一七四五三三换成弧度,手册图注写的就是角度乘圆周率再除一百八十。换成弧度之后,SIN 一算得零点五,正是三十度的正弦;直接写 SIN K30 会得负零点九八八,因为机器只认弧度。最后用 INT 把浮点转回整数,小数点后面四舍五入,结果是一。

想亲手试一下?

这门课的电路,已经给你摆好了。不用装软件,点开就能按按钮、看线圈亮。