搜索
bottom↓
回复: 23

大于2^32的整形能用float表示吗???

[复制链接]

出0入0汤圆

发表于 2012-3-30 12:54:34 | 显示全部楼层 |阅读模式
大于2^32的整形能用float表示吗???
我float的范围是
-3.40E+38 ~ +3.40E+38

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出30入25汤圆

发表于 2012-3-30 13:00:34 | 显示全部楼层
丢精度……

出30入25汤圆

发表于 2012-3-30 13:03:38 | 显示全部楼层
丢精度……

出0入0汤圆

发表于 2012-3-30 13:08:07 | 显示全部楼层
可以用,但精度不够。

出0入0汤圆

发表于 2012-3-30 19:32:38 | 显示全部楼层
没什么不能用的。呵呵。

出0入0汤圆

 楼主| 发表于 2012-3-30 20:39:28 | 显示全部楼层
xue_pic 发表于 2012-3-30 13:08
可以用,但精度不够。

谢谢回复啊,精度不够是什么是意思
float不是能表示小数吗,
我只用float的整数部分啊?
谢谢..........

出0入0汤圆

 楼主| 发表于 2012-3-30 20:40:13 | 显示全部楼层
shamiao 发表于 2012-3-30 13:00
丢精度……

丢精度是什么意思,求教......

出0入0汤圆

发表于 2012-3-30 21:01:32 | 显示全部楼层
浮点数运算速度慢,相应运算时间会变长,带来比较大的工作时间,然后功耗就大了,你可以做实验试试,看看是不是拖运算速度.
而且运算不准确,你可以做个实验,算2^50-1125899906842624,你将会得到意想不到的数字,这就是丢精度.

出0入0汤圆

发表于 2012-3-30 21:15:14 | 显示全部楼层
丢精度。float的表示数的精度不是均匀的。两个相邻大数字的差要远大于两个相邻小数字的差。整形数字则都是一样的

出0入0汤圆

 楼主| 发表于 2012-3-30 21:37:57 | 显示全部楼层
vows 发表于 2012-3-30 21:01
浮点数运算速度慢,相应运算时间会变长,带来比较大的工作时间,然后功耗就大了,你可以做实验试试,看看是不是 ...

那不进行加减运算,乘法运算呢?也会丢精度?
(float)( X)*y
X为大于2^32的数,y为float数

出0入0汤圆

发表于 2012-3-30 22:05:49 | 显示全部楼层
有效数字的问题么。有效数字的个数是固定的。

出0入0汤圆

 楼主| 发表于 2012-3-30 22:25:51 | 显示全部楼层
还是不大 明白??????????????

出0入0汤圆

发表于 2012-3-30 22:30:00 | 显示全部楼层
本帖最后由 vows 于 2012-3-30 22:48 编辑
ilikeavr666 发表于 2012-3-30 21:37
那不进行加减运算,乘法运算呢?也会丢精度?
(float)( X)*y
X为大于2^32的数,y为float数


我写了一段简单的程序,证明乘法运算是丢精度的.
我是用的单片机是msp430f449,带硬件乘法器的.
代码如下:

#include "io430.h"

int main( void )
{
  float a,b,c;
  int i;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  a=1.00000;
  a=(float)(123456789123456789)*a;
  b=(float)(123456789123456789)*0.5;
  for(i=0;i<1000;i++)
    b=b*0.5;
  for(i=0;i<1000;i++)
    b=b*2;
  b=b*2;// 这里下断点
  c=10;
  if(a==b)
    c=1;
  c=c*c;
  b=c;
  return 0;
}
为了保险,我做了1000次以上的乘法运算,并且只作乘法运算.
如果乘法运算不会丢精度,那么运行到最后b=c的那句时,c的值应当仍然为1.0
上图:
开始运行时,

到这一步,c已经被赋值,为10.0.如果乘法运算是精确的话,那么if语句里的c=1应当被执行.

可是到了最后,c变成了100.说明a==b不成立.

由此可见,float类型的乘法计算在msp430f449上是丢精度的.
------------------------
编辑理由:更正程序

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-3-30 22:41:15 | 显示全部楼层
vows 发表于 2012-3-30 22:30
我写了一段简单的程序,证明乘法运算是丢精度的.
我是用的单片机是msp430f449,带硬件乘法器的.
代码如下:

int main( void )
{
  float a,b,c;
  int i;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  a=64;
  a=(float)(123456789123456789)*a;
  b=(float)(123456789123456789)*0.5;
  for(i=0;i<1000;i++)
    b=b*0.5;
  for(i=0;i<1000;i++)
    b=b*2;
  b=b*2;// 这里下断点
  c=10;
  if(a==b)
    c=1;
  c=c*c;
  b=c;
  return 0;
}
为了保险,我做了1000次以上的乘法运算,并且只作乘法运算.
如果乘法运算不会丢精度,那么运行到最后b=c的那句时,c的值应当仍然为1.0
上图:
开始运行时,

到这一步,c已经被赋值,为10.0.如果乘法运算是精确的话,那么if语句里的c=1应当被执行.

可是到了最后,c变成了100.说明a==b不成立.

由此可见,float类型的乘法计算在msp430f449上是丢精度的.



谢谢回复啊,
看你的程序,是b乘1000次0.5
再b乘1000次2,相当于乘1000次1
值应该为123456789123456789

你的a是不是
a=64;
a=(float)(123456789123456789)*a;

a =(float)(123456789123456789)*64;

那a和b是不是就是不相等??????

出0入0汤圆

发表于 2012-3-30 22:50:33 | 显示全部楼层
ilikeavr666 发表于 2012-3-30 22:41
int main( void )
{
  float a,b,c;

谢谢你的提醒,
突然发现我真糊涂了......
我已经把程序更新了一下,请查看楼上

出0入0汤圆

 楼主| 发表于 2012-3-31 09:30:44 | 显示全部楼层
vows 发表于 2012-3-30 22:50
谢谢你的提醒,
突然发现我真糊涂了......
我已经把程序更新了一下,请查看楼上 ...

呵呵,,,,,太正常了....
1000次后
仿真的结果a和b差多少呢????????????

出350入477汤圆

发表于 2012-3-31 09:34:29 | 显示全部楼层
浮点数的二进制表示格式参见IEEE754标准(可百度)
简单来说,32位的float由如下几个部分组成(除了0,正负无穷大,非法数字等特例,还有特别小以及特别大的非规格化的数):
1bit符号位 0正1负
8bit指数 也就是×2的N次方,这个N的范围是-127~+128,实际表示的时候要加127,作为8位的无符号数
24bit有效数字 该数字需要写成二进制的1.zzzzzzzzzzzzzzzzzzzzzzz的形式,省略最高位的1,只存储后面的23bit数字(也就是23个z,每个z只能是0或1)

这就是float只有7位有效数字的原因(24bit二进制的有效数字,换算成十进制是16兆,比7位有效数字的7个9大一点,但远小于8位有效数字的8个9)
float的范围是10 的正负38次方,也是这么来的(2的127或128次方,也就是10的38次方,ln(2)*127/ln(10)=38)

出0入0汤圆

 楼主| 发表于 2012-3-31 09:46:32 | 显示全部楼层
vows 发表于 2012-3-30 22:50
谢谢你的提醒,
突然发现我真糊涂了......
我已经把程序更新了一下,请查看楼上 ...

我仿真了下,
怎么断点处,b怎么都等于0了....

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-3-31 09:54:23 | 显示全部楼层
如果不行...

我用这种方法

(double) X * (double)y
X为大于2^32的数,y为float数

行不行.....

出0入0汤圆

发表于 2012-4-5 17:18:44 | 显示全部楼层
ilikeavr666 发表于 2012-3-30 22:25
还是不大 明白??????????????

用FLOAT表示大的整形肯定都会丢精度的,什么运算没区别的吧

出0入0汤圆

发表于 2012-4-5 17:19:07 | 显示全部楼层
ilikeavr666 发表于 2012-3-31 09:54
如果不行...

我用这种方法

DOUBLE也是一样的,丢精度

出0入0汤圆

 楼主| 发表于 2012-4-6 22:58:51 | 显示全部楼层
谢谢啊,我就直接乘了,乘完了再右移缩小,

出0入0汤圆

发表于 2012-4-8 15:25:46 | 显示全部楼层
特别的奇怪,问一个问题。你在使用单片机做什么东西啊?长整形数据还不够你用吗?为什么一定要用浮点的数据呢?你用的是单片机不是计算机。
呵呵呵!有效的处理好数据,分段处理与运算,大大的增加运算速度而且程序的可靠性增强。
要是放在10年前,用汇编写一个浮点运算程序,会累死人的。你就会抛弃现在的想法。还是整形数据吧,好处理。哈哈,个人意见,仅供参考!

出0入0汤圆

 楼主| 发表于 2012-4-9 14:15:59 | 显示全部楼层
lvyunzeng 发表于 2012-4-8 15:25
特别的奇怪,问一个问题。你在使用单片机做什么东西啊?长整形数据还不够你用吗?为什么一定要用浮点的数据 ...

谢谢回复

交流采样,计算有效值
16位AD
采样60点
采样后各点要平方和

结果就大于2^32了......
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 20:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表