打印

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

[复制链接]
2923|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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编译器每一步都是以浮点型数据进行运算的?

使用特权

评论回复
5
tinnyman|  楼主 | 2011-4-3 21:29 | 只看该作者
VC++6.0编译器下 z值计算正确

使用特权

评论回复
6
tinnyman|  楼主 | 2011-4-3 22:17 | 只看该作者
4096后面加个小数点就可以了
wh6ic 发表于 2011-4-3 21:27

谢谢
在10后面加小数点后正常

使用特权

评论回复
7
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编译器每一步都是以浮点型数据进行运算的?

使用特权

评论回复
8
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;显式的提升算式中数据的类型

使用特权

评论回复
9
李冬发| | 2011-4-3 23:00 | 只看该作者
z=1111.0f*5.0f*10.0f/4096.0f

使用特权

评论回复
10
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用于单片机  不必过于考虑程序代码空间大小问题

使用特权

评论回复
11
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后面加小数点多存储了一个浮点空间?

使用特权

评论回复
12
tinnyman|  楼主 | 2011-4-4 00:40 | 只看该作者
书上说赋值运算是从右向左结合的

使用特权

评论回复
13
tinnyman|  楼主 | 2011-4-4 11:06 | 只看该作者
不对呀 就算从右向左算 第一步10/4096也是浮点型呀 为什么下面两种写法的code占用不同呢?
①z=ad*5.0*10/4096;
②z=ad*5*10.0/4096;

使用特权

评论回复
14
tinnyman|  楼主 | 2011-4-4 11:08 | 只看该作者
ad=1111
程序是①占用code比较小.

使用特权

评论回复
15
yuancheng116| | 2011-4-4 11:35 | 只看该作者
实数没加小数点!

使用特权

评论回复
16
dqyubsh| | 2011-4-4 15:15 | 只看该作者
象10楼写的那样,即便是VC算对了,也应该人为强制转换。养成良好的习惯,而不仅仅依赖编译器。

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

KEIL C环境里,如果分母是4096,那么除以4096就应该用移位操作,效率会提高,代码长度也会缩减。

使用特权

评论回复
17
gongmaomao| | 2011-4-15 13:06 | 只看该作者
对于浮点型计算,你要在分子上在乘以一个 1.0   你在试下

使用特权

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

本版积分规则

0

主题

20

帖子

1

粉丝