矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 电子马甲

一个十六位的二进制小数,想转化为十进制小数,有没有简单的方法?

[复制链接]
     
 楼主| 发表于 2018-3-23 19:51:32 | 显示全部楼层
yjmwxwx 发表于 2018-3-23 18:35
你说这个程序我以前写过,不过是ARMV7的汇编。 下面是23位转换的程序,这个其实是浮点转定点程序里面拿 ...

谢谢,

我也设计了一个8位的二进制数转小数的汇编,

思路就是先判断最高位是1 的话,往“口袋”里+0.5 ,再判断次高位是1的话往往“口袋”里+0.25,。。。这样做8次判断,8次加法,倒也不是很复杂,要是位数再多就不好弄了。
回复 支持 1 反对 0

使用道具 举报

     
发表于 2018-3-23 20:15:59 | 显示全部楼层
电子马甲 发表于 2018-3-23 19:51
谢谢,

我也设计了一个8位的二进制数转小数的汇编,


刚才看错了,这种算法感觉很麻烦还要相加,不知道用整数大数计算和这个哪个快,我也比较迷茫不知道到底用哪个,以前还专门写过64位乘法除法的函数,后来也没用,要快是不是只能用定点?
回复 支持 反对

使用道具 举报

     
发表于 2018-3-23 20:44:37 | 显示全部楼层
电子马甲 发表于 2018-3-23 19:51
谢谢,

我也设计了一个8位的二进制数转小数的汇编,

我以前在网上找的Q15一些用法不知道有不有用,我都chrome翻译看的,管他有没有用贴出来https://sestevenson.wordpress.com/introduction-to-fixed-point-representation/
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-24 16:27:33 | 显示全部楼层
yjmwxwx 发表于 2018-3-23 20:44
我以前在网上找的Q15一些用法不知道有不有用,我都chrome翻译看的,管他有没有用贴出来https://sestevens ...

谢谢,先收藏,以后慢慢啃。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-24 16:50:35 | 显示全部楼层
本帖最后由 电子马甲 于 2018-3-24 16:55 编辑

我自己琢磨的取得四位小数的办法,   虽然很笨拙,但是直观,可靠, 见笑了
;************************************************************************************************************
;  单字节数 转换为小数
;  要转换的数在29H,    最后的小数在 31H 30H  
;  出口    31H,30H ( 需转换为BCD码,转换后的千百十个位,是小数的 十分位 百分位 千分位 万分位。
;*************************************************************************************************************8

XIAO_SHU_8:
                      MOV     31H,#0
                      MOV     30H,#0                                 ; 清空(很重要哦)    把所有的小数位数往里加
                      MOV  20H   ,  29H                             ; 小数部分放入20H  20H 可以位寻址。
X_S_BIT2:      JB   07H   ,  XIAO_SHU_BIT1             ; 第1位是1 跳到 加5000
X_S_BIT2:      JB   06H   ,  XIAO_SHU_BIT2             ; 第2位是1 跳到 加2500
X_S_BIT3:      JB   05H   ,  XIAO_SHU_BIT3             ; 第3位是1 跳到 加1250
X_S_BIT4:      JB   04H   ,  XIAO_SHU_BIT4             ; 第4位是1 跳到 加625
X_S_BIT5:      JB   03H   ,  XIAO_SHU_BIT5             ; 第5位是1 跳到 加313
X_S_BIT6:      JB   02H   ,  XIAO_SHU_BIT6             ; 第6位是1 跳到 加156
X_S_BIT7:      JB   01H   ,  XIAO_SHU_BIT7             ; 第7位是1 跳到 加78
X_S_BIT8:      JB   00H   ,  XIAO_SHU_BIT8             ; 第8位是1 跳到 加39
X_S_over:   
               RET                                     ;  
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT1:                                      ; 第1位+5000 (0.5)     
               MOV  31H ,#13H
               MOV  30H ,#88H                       ; 小数点后第一位为1 往盒子里放 5000 (就是0.5) 下面的都是这个意思
               JMP  X_S_BIT2                        ; 加完第一位 跳到判断第二位              
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT2:                                      ; 第2位+2500 (0.25)
               MOV    A , 30H                          ;
               ADD    A , #0C4H                     ;
               MOV    30H, A                           ;
               MOV    A , 31H                          ;
               ADDC   A , #09H                      ;
               MOV    31H ,A                           ;
               JMP  X_S_BIT3                         ; 加完第2位 跳到判断第3位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT3:                                     ; 第3位+1250 (0.125)
               MOV    A , 30H                          ;
               ADD    A , #0E2H                     ;
               MOV    30H, A                           ;
               MOV    A , 31H                          ;
               ADDC   A , #04H                      ;
               MOV    31H ,A                           ;
               JMP  X_S_BIT4                         ; 加完第3位 跳到判断第4位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT4:                                     ; 第4位+625 (0.0625)
               MOV    A , 30H                          ;
               ADD    A , #71H                       ;
               MOV    30H, A                          ;
               MOV    A , 31H                         ;
               ADDC   A , #02H                     ;
               MOV    31H ,A                          ;
               JMP  X_S_BIT5                        ; 加完第4位 跳到判断第5位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT5:                                    ; 第5位+313 (0.0313)
               MOV    A , 30H                         ;
               ADD    A , #39H                      ;
               MOV    30H, A                         ;
               MOV    A , 31H                        ;
               ADDC   A , #01H                    ;
               MOV    31H ,A                         ;
               JMP  X_S_BIT6                       ; 加完第5位 跳到判断第6位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT6:                                  ; 第6位+156 (0.0156)
               MOV    A , 30H                       ;
               ADD    A , #9CH                    ;
               MOV    30H, A                        ;
               MOV    A , 31H                       ;
               ADDC   A , #00H                   ;
               MOV    31H ,A                        ;
               JMP  X_S_BIT7                      ; 加完第6位 跳到判断第7位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT7:                                  ; 第7位+78 (0.0078)
               MOV    A , 30H                       ;
               ADD    A , #78                       ;
               MOV    30H, A                        ;
               MOV    A , 31H                       ;
               ADDC   A , #00H                   ;
               MOV    31H ,A                        ;
               JMP    X_S_BIT8                    ; 加完第7位 跳到判断第8位   
;----------------------------------------------------------------------------------------------------------------------------------------
XIAO_SHU_BIT8:                                  ; 第8位+39(0.0039)
               MOV    A , 30H                       ;
               ADD    A , #39                       ;
               MOV    30H, A                        ;
               MOV    A , 31H                       ;
               ADDC   A , #00H                    ;
               MOV    31H ,A                        ;
               JMP    X_S_OVER                      ; 加完第8位            
;-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

     
发表于 2018-4-3 00:19:14 | 显示全部楼层
WIN10系统自带的计算器有进制计算有功能
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-7-28 12:43:23 | 显示全部楼层
diyou 发表于 2018-4-3 13:55
楼主就不要自己瞎折磨了。搜一下

求补码的汇编也是自己编的,长长一大串,网上一搜---就两句
回复 支持 反对

使用道具 举报

     
发表于 2019-1-1 21:47:13 | 显示全部楼层
最简便的方法:原数先乘10n次方,然后除10取余至商为零。根据n定小数位。协处理器不怕累。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-11 02:17:54 来自手机 | 显示全部楼层
位数不多的话,直接查表最省心。8位直接查表不要太快
回复 支持 反对

使用道具 举报

     
发表于 2019-2-18 11:24:07 | 显示全部楼层
好像这个对于PLC来说就是一个指令的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-3-29 17:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表