求助求助 浮点型计算问题

[复制链接]
 楼主| 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
别沉啊 求助求助


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| ragion 发表于 2018-7-5 12:52 | 显示全部楼层
tyw 发表于 2018-7-5 13:08 | 显示全部楼层

哈哈,当年就是靠这些资料玩通了浮点运算.
混子黄 发表于 2018-7-5 13:33 | 显示全部楼层


帮顶。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| ragion 发表于 2018-7-5 14:16 | 显示全部楼层

用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1
gx_huang 发表于 2018-7-5 14:32 | 显示全部楼层
浮点转整数,加0.5再取整即可,不会这么难吧。
如果结果是3.0,也许是2.9999,也许是3.000001,直接取整,当然可能差1了。
混子黄 发表于 2018-7-5 14:33 | 显示全部楼层
ragion 发表于 2018-7-5 14:16
用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1

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

我认为你写的没有问题。

或者什么时候A的值变了?
ayb_ice 发表于 2018-7-5 14:46 | 显示全部楼层
本帖最后由 ayb_ice 于 2018-7-5 14:47 编辑

软件仿真下,看d1d2值是否正确,正确的话肯定是串口相关部分的问题
另外浮点数除以一个数,再乘以一个数,值回不到原值是正常的
混子黄 发表于 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.
混子黄 发表于 2018-7-5 16:18 | 显示全部楼层
楼主这个3  / 10 应该就是确定的0.3吧,难道保存的0.3取出来的时候变成了2.999999?
 楼主| ragion 发表于 2018-7-6 11:25 | 显示全部楼层
混子黄 发表于 2018-7-5 16:18
楼主这个3  / 10 应该就是确定的0.3吧,难道保存的0.3取出来的时候变成了2.999999? ...

具体小数的值我这边显示不出 所以我只能再乘以个数让它等于整数后再通过串口发送出来观察。。。但是输出的结果总是差一个
wh6ic 发表于 2018-7-6 13:41 | 显示全部楼层
  Atmel 的 C 编译器根本就不支持什么双精度浮点数运算。 它在骗你。
877049204 发表于 2018-7-6 17:11 | 显示全部楼层
设置断点,在WATCH窗口好好看看
henangongda123 发表于 2018-7-6 17:12 | 显示全部楼层
ragion 发表于 2018-7-5 14:16
用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1

现在还有AVR?
dzguang 发表于 2018-7-7 11:35 | 显示全部楼层
是你开了优化吧。或者编译器自己干了优化了。你应该去看他汇编后的语句。是不是变成了d1=a这个语句。下面就是正常的运行的,double这样的本来就会损失精度的。
dzguang 发表于 2018-7-7 11:37 | 显示全部楼层
你可以把数据放大10倍进行处理。这样在你的精度范围以内就
PPDDPPDD1234 发表于 2018-7-7 12:01 | 显示全部楼层
因为,这个系统只支持单精度浮点运算,也就是2.999999,再后面的数据就是随机了。。。。
d2估计就是这么随机的。

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

即使是双精度的浮点运算,也是一样存在这个问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部