打印

求助求助 浮点型计算问题

[复制链接]
1446|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ragion|  楼主 | 2018-7-5 10:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序如下:
       double a=3.0,b=10.0,d1,d2;
       double cc;
       init_devices();
       delay_nms(500);
          
           cc=3.0/10.0;
           d1=b*cc;
          
           cc=a/b;
           d2=b*cc;

用串口接收到的结果,d1为03,d2为02.为什么呢,不应该是d1跟d2都等于03么?求大神解释一下,并且求助如何令d2等于03(需要强制类型转换么?怎么转?最好详细一些)

相关帖子

沙发
ragion|  楼主 | 2018-7-5 11:00 | 只看该作者
别沉啊 求助求助

使用特权

评论回复
板凳
tyw| | 2018-7-5 11:55 | 只看该作者
ragion 发表于 2018-7-5 11:00
别沉啊 求助求助

浮点数转换 48册 108M.rar (84.7 MB)

使用特权

评论回复
地板
ragion|  楼主 | 2018-7-5 12:52 | 只看该作者

谢谢 我看一下

使用特权

评论回复
5
tyw| | 2018-7-5 13:08 | 只看该作者

哈哈,当年就是靠这些资料玩通了浮点运算.

使用特权

评论回复
6
混子黄| | 2018-7-5 13:33 | 只看该作者


帮顶。

使用特权

评论回复
7
ragion|  楼主 | 2018-7-5 14:16 | 只看该作者

用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1

使用特权

评论回复
8
gx_huang| | 2018-7-5 14:32 | 只看该作者
浮点转整数,加0.5再取整即可,不会这么难吧。
如果结果是3.0,也许是2.9999,也许是3.000001,直接取整,当然可能差1了。

使用特权

评论回复
9
混子黄| | 2018-7-5 14:33 | 只看该作者
ragion 发表于 2018-7-5 14:16
用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1

没有用单片机,直接C控制台输出看的。

我认为你写的没有问题。

或者什么时候A的值变了?

使用特权

评论回复
10
ayb_ice| | 2018-7-5 14:46 | 只看该作者
本帖最后由 ayb_ice 于 2018-7-5 14:47 编辑

软件仿真下,看d1d2值是否正确,正确的话肯定是串口相关部分的问题
另外浮点数除以一个数,再乘以一个数,值回不到原值是正常的

使用特权

评论回复
11
混子黄| | 2018-7-5 16:15 | 只看该作者
double a,b,c,d;

c = a / b ;
d = c * b;
a == d ?

有点好奇 。

整除应该可以吧,比如a = 10 / 2;b = a * 2 ; b=10 ;
小数的话可能不行 , 比如a = 5/3 = 1.66667 ;      1.66667 * 3 =5.00001.

使用特权

评论回复
12
混子黄| | 2018-7-5 16:18 | 只看该作者
楼主这个3  / 10 应该就是确定的0.3吧,难道保存的0.3取出来的时候变成了2.999999?

使用特权

评论回复
13
ragion|  楼主 | 2018-7-6 11:25 | 只看该作者
混子黄 发表于 2018-7-5 16:18
楼主这个3  / 10 应该就是确定的0.3吧,难道保存的0.3取出来的时候变成了2.999999? ...

具体小数的值我这边显示不出 所以我只能再乘以个数让它等于整数后再通过串口发送出来观察。。。但是输出的结果总是差一个

使用特权

评论回复
14
wh6ic| | 2018-7-6 13:41 | 只看该作者
  Atmel 的 C 编译器根本就不支持什么双精度浮点数运算。 它在骗你。

使用特权

评论回复
15
877049204| | 2018-7-6 17:11 | 只看该作者
设置断点,在WATCH窗口好好看看

使用特权

评论回复
16
henangongda123| | 2018-7-6 17:12 | 只看该作者
ragion 发表于 2018-7-5 14:16
用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1

现在还有AVR?

使用特权

评论回复
17
dzguang| | 2018-7-7 11:35 | 只看该作者
是你开了优化吧。或者编译器自己干了优化了。你应该去看他汇编后的语句。是不是变成了d1=a这个语句。下面就是正常的运行的,double这样的本来就会损失精度的。

使用特权

评论回复
18
dzguang| | 2018-7-7 11:37 | 只看该作者
你可以把数据放大10倍进行处理。这样在你的精度范围以内就

使用特权

评论回复
19
PPDDPPDD1234| | 2018-7-7 12:01 | 只看该作者
因为,这个系统只支持单精度浮点运算,也就是2.999999,再后面的数据就是随机了。。。。
d2估计就是这么随机的。

错误不在于计算,在于你的串口发送代码,如果你发送全部的d2,就是2.999999或者2.999998或者3.0000001那就没有错误了。你现在只发送一位,可不就错误了吗。

即使是双精度的浮点运算,也是一样存在这个问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

18

帖子

0

粉丝