求助浮点型计算问题

2025-03-13 00:43:48
推荐回答(2个)
回答1:

程序如下:

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 14:16
用的什么单片机  我用的是AVR MEGA16 输出的结果总是差1
没有用单片机,直接C控制台输出看的。

我认为你写的没有问题。

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

浮点转整数,加0.5再取整即可,不会这么难吧。
如果结果是3.0,也许是2.9999,也许是3.000001,直接取整,当然可能差1了。

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

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.    

楼主这个3  / 10 应该就是确定的0.3吧,难道保存的0.3取出来的时候变成了2.999999? ...
具体小数的值我这边显示不出 所以我只能再乘以个数让它等于整数后再通过串口发送出来观察。。。但是输出的结果总是差一个

Atmel 的 C 编译器根本就不支持什么双精度浮点数运算。 它在骗你。    

设置断点,在WATCH窗口好好看看    

是你开了优化吧。或者编译器自己干了优化了。你应该去看他汇编后的语句。是不是变成了d1=a这个语句。下面就是正常的运行的,double这样的本来就会损失精度的。    

因为,这个系统只支持单精度浮点运算,也就是2.999999,再后面的数据就是随机了。。。。
d2估计就是这么随机的。

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

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

回答2:

编译器会生成代码自动将times和temp转换为双精度的浮点数,然后在进行计算。