本帖问题已经解决,感谢论坛大神的帮助。![]() |
Hephaestus 发表于 2021-10-21 15:04 您批评的是,网页的确是举例的特殊情况,我被误导了,谢谢您的指教,我明白了。 |
yermsir 发表于 2021-10-21 14:37 瞎扯淡,那个网页举得栗子就是特殊情况,-0.5和+0.5只差一个符号位所以可以得到正确答案,你算个-0.25试试?去掉符号位-0.25不就变成0.75了??? 说了半天你还是没弄懂Q15是什么,以16位Q15为例: 0~7fff表示0~0.99999 ffff~8000表示-0.00001~-1.0 |
Hephaestus 发表于 2021-10-21 12:25 https://blog.csdn.net/yanxiaopan/article/details/76853040 我在这个网站上看到Q15格式的数,直接把两个负数相乘,右移15位就可以得到结果。比如网址中举例:-0.5*-0.5。 ‘’对于Q15,例如计算-0.5×-0.5,0.5表示为二进制为0100000000000000,取反加1后为1100000000000000,则-0.5×-0.5的二进制相乘结果为10010000000000000000000000000000,右移15位,得到10010000000000000‘’ 难道Q15的负数,并不是两个负数直接相乘?而是先转化为正数,然后再相乘? |
yermsir 发表于 2021-10-21 10:54 A022是负数啊!对应的绝对值相同的正数是5FDE,他的平方就是47CD0908,不就是你例1里面你用蓝笔勾出来的20000000+47CD0908=67CD0908吗? |
Hephaestus 发表于 2021-10-20 22:40 谢谢您的回复,让我了解了Q15小数的运算规则。我用您的方法来计算例1,却发现结果和例子对不上。 计算过程如下: A022(Q15)=-0.7489624 A022(Q15)^2 = 642A8484 A022(Q15)^2 *2 = C8550908(Q31) =1.56509507 而真正的结果为:(-0.7489624)*(-0.7489624)=-0.56094467 可见我的计算是错误的,例1和例2的区别就是负数和正数,网上查了一些资料,但是都是间接的说明,自己还是悟不透,您能不能进一步解释一下例1是怎么计算出来的? |
Hephaestus 发表于 2021-10-20 22:40 好的,我知道了 |
Y_G_G 发表于 2021-10-20 22:23 我负责的第一个电子项目是一个压力计,核心算法用最小二乘法拟合标定数据,中间就是用Q31定点数运算,写了3000行8051汇编。 定点数跟汇编没有你死我活的关系,相反有很多位操作,用汇编实现更方便,关键是你要理解定点数。如果你什么都不懂,就闭嘴,随便置喙只能被人笑掉大牙。 |
Hephaestus 发表于 2021-10-20 20:50 我是不懂这个运算,因为我之前一直是用汇编的,没有定点数这个概念,所以我不会这个 你既然知道,又是在这个论坛逛的,就没有必要数落我,我一没得罪你,二我也说了并不会这个 很显然,我来这的目的和你是不一样的 我一个是打发时间,二个是相互学习 而你,我不知道,当然,也不想知道 |
好吧,我把数给你算出来了,不要听那个啥都不懂的呱噪。 76AE * 76AE * 2 + FE98344500 = FF063E0188 这里面最关键的是莫名其妙出现的这个2,你的原数是16位Q15格式,如果直接按整数平方,得到一个32位的整数结果,如果把它看成是Q定点格式,那么将是Q30格式——平方之前小数点在第15位前,平方后小数点在第30位前,而是Q30格式定点数是没啥用的,要转成更通用的Q31格式才好用,毕竟把Q51的低16位扔掉就回到了Q15格式,太方便了。 从表达的数字上讲可以这么分析 76AE(Q15)= 0.927185 76AE(Q15)^2 = 3704DE44(Q31) = 0.429836 ——这个结果显然是错的,差了2倍。 76AE(Q15)^2 *2 = 6E09BC88(Q31) = 0.859672 6E09BC88 + FE98344500 = FF063E0188 完美的解释了你的例2!!! |
yermsir 发表于 2021-10-20 18:37 没有用过16位单片机,不知道 我只用过8位的,一般都是编译器处理的,不需要去了解汇编方面的运算,在C语言中有乘除运算,就会对应的生成乘除法汇编指令,单片机内部自动用乘法器运算 至于这个数怎么来的,不知道 我以前只用过PIC的8位机,而且是汇编,汇编没有小数正负数的说法 |
Y_G_G 发表于 2021-10-20 15:54 我还是想要知道附图中,例子计算的结果是怎么来的,这样我心里会对小数的计算才有把握。 |
Hephaestus 发表于 2021-10-20 17:07 我见过什么数跟楼主的"PIC33单片机乘法器小数模式"主题有什么关系吗? |
Y_G_G 发表于 2021-10-20 15:54 Q15是定点(fixed point)数,你只见过float point,鉴定完毕。 |
这个是硬件乘法器,计算过程是硬件执行的,不是软件计算的 你只要知道,你要进行什么运算,通过控制寄存器来选择运算选项就可以了 再看一下用不用读取输出,有的编译器是直接就是浮点型结果,有的是则是保存在某个寄存器,需要读取的 这个专业性很强的,没有真正用过的人也只能是给个指导性知识而已,真正的,还是要你自己去看的 |