请教一个浮点型数据运算的问题

[复制链接]
 楼主| tinnyman 发表于 2011-4-3 15:06 | 显示全部楼层 |阅读模式
float z;
z=1111*5*10/4096;
z最后为什么算出来是-2
而只有用以下程序才可以算出正确值:
float z;
z=1111*5;
z=z*10;
z=z/4096;

z作为一个浮点型数据,为什么还会出现运算错误呢?
MCU型号是89C2051 编译器是keil的
airwill 发表于 2011-4-3 19:47 | 显示全部楼层
那是因为编译器在处理
z=1111*5*10/4096;
的时候, 开始对 1111*5*10/4096 算式是以整数的形式计算的, 算完后才转换成浮点数.

评分

参与人数 1威望 +1 收起 理由
tinnyman + 1 解答正确

查看全部评分

wh6ic 发表于 2011-4-3 21:27 | 显示全部楼层
4096后面加个小数点就可以了
 楼主| tinnyman 发表于 2011-4-3 21:28 | 显示全部楼层
谢谢
另外我想问 我在VC++6.0编译器下 用z=1111*5*10/4096这种表达式算出z值 是否是因为VC++6.0编译器每一步都是以浮点型数据进行运算的?
 楼主| tinnyman 发表于 2011-4-3 21:29 | 显示全部楼层
VC++6.0编译器下 z值计算正确
 楼主| tinnyman 发表于 2011-4-3 22:17 | 显示全部楼层
4096后面加个小数点就可以了
wh6ic 发表于 2011-4-3 21:27

谢谢
在10后面加小数点后正常
 楼主| tinnyman 发表于 2011-4-3 22:18 | 显示全部楼层
那是因为编译器在处理
z=1111*5*10/4096;
的时候, 开始对 1111*5*10/4096 算式是以整数的形式计算的, 算完后才转换成浮点数.
airwill 发表于 2011-4-3 19:47

谢谢
另外我想问 我在VC++6.0编译器下 用z=1111*5*10/4096这种表达式算出z值 是否是因为VC++6.0编译器每一步都是以浮点型数据进行运算的?
lfb112 发表于 2011-4-3 22:55 | 显示全部楼层
30:       float   z;
31:       z=1111*5*10/4096;
00401048   mov         dword ptr [ebp-4],41500000h
:L,没看懂VC++6.0下的汇编,期待高手解答下,我估计VC应该是把该算式中所有的数据提升到了float类型,在进行运算,不过你可以这样写:z=(float)1111*5*10/4096;显式的提升算式中数据的类型
李冬发 发表于 2011-4-3 23:00 | 显示全部楼层
z=1111.0f*5.0f*10.0f/4096.0f
 楼主| tinnyman 发表于 2011-4-3 23:09 | 显示全部楼层
30:       float   z;
31:       z=1111*5*10/4096;
00401048   mov         dword ptr [ebp-4],41500000h
:L,没看懂VC++6.0下的汇编,期待高手解答下,我估计VC应该是把该算式中所有的数据提升到了float类型,在进 ...
lfb112 发表于 2011-4-3 22:55

有可能 VC不像keil用于单片机  不必过于考虑程序代码空间大小问题
 楼主| tinnyman 发表于 2011-4-4 00:33 | 显示全部楼层
我做了个实验,code最小的是这种写法:
z=ad*5.0*10/4096;
其次是z=ad*5*10.0/4096;
然后才是
z=1111*5;
z=z*10;
z=z/4096;
难道keil的编译器是从右往左运算所以在10后面加小数点反而比在5后面加小数点多存储了一个浮点空间?
 楼主| tinnyman 发表于 2011-4-4 00:40 | 显示全部楼层
书上说赋值运算是从右向左结合的
 楼主| tinnyman 发表于 2011-4-4 11:06 | 显示全部楼层
不对呀 就算从右向左算 第一步10/4096也是浮点型呀 为什么下面两种写法的code占用不同呢?
①z=ad*5.0*10/4096;
②z=ad*5*10.0/4096;
 楼主| tinnyman 发表于 2011-4-4 11:08 | 显示全部楼层
ad=1111
程序是①占用code比较小.
yuancheng116 发表于 2011-4-4 11:35 | 显示全部楼层
实数没加小数点!
dqyubsh 发表于 2011-4-4 15:15 | 显示全部楼层
象10楼写的那样,即便是VC算对了,也应该人为强制转换。养成良好的习惯,而不仅仅依赖编译器。

z = float(1111.F * 5.F * 10.F / 4096.F);

KEIL C环境里,如果分母是4096,那么除以4096就应该用移位操作,效率会提高,代码长度也会缩减。
gongmaomao 发表于 2011-4-15 13:06 | 显示全部楼层
对于浮点型计算,你要在分子上在乘以一个 1.0   你在试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

1

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