ilikeavr666 发表于 2012-3-30 12:54:34

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

大于2^32的整形能用float表示吗???
我float的范围是
-3.40E+38 ~ +3.40E+38

shamiao 发表于 2012-3-30 13:00:34

丢精度……

shamiao 发表于 2012-3-30 13:03:38

丢精度……

xue_pic 发表于 2012-3-30 13:08:07

可以用,但精度不够。

ahuang227 发表于 2012-3-30 19:32:38

没什么不能用的。呵呵。

ilikeavr666 发表于 2012-3-30 20:39:28

xue_pic 发表于 2012-3-30 13:08 static/image/common/back.gif
可以用,但精度不够。

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

ilikeavr666 发表于 2012-3-30 20:40:13

shamiao 发表于 2012-3-30 13:00 static/image/common/back.gif
丢精度……

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

vows 发表于 2012-3-30 21:01:32

浮点数运算速度慢,相应运算时间会变长,带来比较大的工作时间,然后功耗就大了,你可以做实验试试,看看是不是拖运算速度.
而且运算不准确,你可以做个实验,算2^50-1125899906842624,你将会得到意想不到的数字,这就是丢精度.

kcn2080 发表于 2012-3-30 21:15:14

丢精度。float的表示数的精度不是均匀的。两个相邻大数字的差要远大于两个相邻小数字的差。整形数字则都是一样的

ilikeavr666 发表于 2012-3-30 21:37:57

vows 发表于 2012-3-30 21:01 static/image/common/back.gif
浮点数运算速度慢,相应运算时间会变长,带来比较大的工作时间,然后功耗就大了,你可以做实验试试,看看是不是 ...

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

leeber2000 发表于 2012-3-30 22:05:49

有效数字的问题么。有效数字的个数是固定的。

ilikeavr666 发表于 2012-3-30 22:25:51

还是不大 明白??????????????

vows 发表于 2012-3-30 22:30:00

本帖最后由 vows 于 2012-3-30 22:48 编辑

ilikeavr666 发表于 2012-3-30 21:37 static/image/common/back.gif
那不进行加减运算,乘法运算呢?也会丢精度?
(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上是丢精度的.
------------------------
编辑理由:更正程序

ilikeavr666 发表于 2012-3-30 22:41:15

vows 发表于 2012-3-30 22:30 static/image/common/back.gif
我写了一段简单的程序,证明乘法运算是丢精度的.
我是用的单片机是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是不是就是不相等??????

vows 发表于 2012-3-30 22:50:33

ilikeavr666 发表于 2012-3-30 22:41 static/image/common/back.gif
int main( void )
{
float a,b,c;


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

ilikeavr666 发表于 2012-3-31 09:30:44

vows 发表于 2012-3-30 22:50 static/image/common/back.gif
谢谢你的提醒,
突然发现我真糊涂了......
我已经把程序更新了一下,请查看楼上 ...

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

redroof 发表于 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)

ilikeavr666 发表于 2012-3-31 09:46:32

vows 发表于 2012-3-30 22:50 static/image/common/back.gif
谢谢你的提醒,
突然发现我真糊涂了......
我已经把程序更新了一下,请查看楼上 ...

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

ilikeavr666 发表于 2012-3-31 09:54:23

如果不行...

我用这种方法

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

行不行.....

asunders 发表于 2012-4-5 17:18:44

ilikeavr666 发表于 2012-3-30 22:25 static/image/common/back.gif
还是不大 明白??????????????

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

asunders 发表于 2012-4-5 17:19:07

ilikeavr666 发表于 2012-3-31 09:54 static/image/common/back.gif
如果不行...

我用这种方法


DOUBLE也是一样的,丢精度

ilikeavr666 发表于 2012-4-6 22:58:51

谢谢啊,我就直接乘了,乘完了再右移缩小,

lvyunzeng 发表于 2012-4-8 15:25:46

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

ilikeavr666 发表于 2012-4-9 14:15:59

lvyunzeng 发表于 2012-4-8 15:25 static/image/common/back.gif
特别的奇怪,问一个问题。你在使用单片机做什么东西啊?长整形数据还不够你用吗?为什么一定要用浮点的数据 ...

谢谢回复

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

结果就大于2^32了......
页: [1]
查看完整版本: 大于2^32的整形能用float表示吗???