Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 13756|回复: 12

[已解决]vba中的各个数据类型的数值范围是怎么算出来的

[复制链接]
发表于 2014-1-2 09:45 | 显示全部楼层 |阅读模式
向单精度single,双精度double等等这些数据类型的数值范围是怎么算出来的?
最佳答案
2014-1-2 21:01
接近0的最小数值=2^-23*2^-126=2^-149=1.401298E-45

发表于 2014-1-2 11:04 | 显示全部楼层
本帖最后由 香川群子 于 2014-1-2 11:05 编辑

'Byte (0-255)
使用1个byte有8个开关来存储数据,所以全部排列组合=2^8=256种状态,对应0-255个数值。

byte = 一个字节,是二进制的8位存储单元,即有8个状态位置存储。以下同


'&=Integer 2 byte (-2^15 to 32,767) 2^16/2
整型变量有2个字节(1个字元)可以存储16个状态位置,
所以一共是 2^16种类的数值。

由于需要包含正负数和0,所以0和正整数取一半区域,另外一半给负数使用。
于是,上半区存储0和正整数、范围0 以及 1- (2^16/2-1)= 0 to 32767 共32768个数值
而下半区存储负数即0范围 -2^16/2 到 -1 即 -32768 to -1 也是32768个数值


'&=Long 4 byte (-2^31 to 2,147,483,647) 2^32/2 ⇒2.147E9
长整型变量有4个字节(2个字元)可以存储32个状态位置,
所以一共是 2^32种类的数值。

由于需要包含正负数和0,所以0和正整数取一半区域,另外一半给负数使用。
于是,上半区存储0和正整数、范围0 以及 1- (2^32/2-1)= 0 to 2,147,483,647
而下半区存储负数即0范围 -2^32/2 到 -1 即 -2,147,483,648 to -1


'@=Currency 8 byte 2^64/2=9.22E18/10^4
(-922,337,203,685,477.5808 to 922,337,203,685,477.5807)
同理,货币格式有8个字节(4个字元)可存储 2^64种不同的数值。
分上半区0和正数、以及下半区负数,小数点后保留4位。


'!=Single 4 byte(-3.402823E38 to -1.401298E-45 ) (1.401298E-45 to 3.402823E38)
单精度4个字节(2个字元)

'#=Double 8 byte(-1.79769313486231E308 to -4.94065645841247E-324)(4.94065645841247E-324 to 1.79769313486232E308 )
双精度8个字节(4个字元)

注意单精度和双精度都是用浮点小数的方法来存储和表示数值的,因此范围比整数大很多。

回复

使用道具 举报

 楼主| 发表于 2014-1-2 12:08 | 显示全部楼层
香川群子 发表于 2014-1-2 11:04
'Byte (0-255)
使用1个byte有8个开关来存储数据,所以全部排列组合=2^8=256种状态,对应0-255个数值。

...

前面几个都列了公式那么后面两个,就是单精度和双精度的没有列,不明白那两个数据是怎么来的?
回复

使用道具 举报

发表于 2014-1-2 20:15 | 显示全部楼层
单精度浮点数(Single) 用来表示带有小数部分的实数,一般用于科学计算。

占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位。

其数值范围为-3.4E38~3.4E38
单精度浮点数n最多有7位十进制有效数字

单精度浮点数的指数用“E”或“e”表示。
单精度浮点数有多种表示形式:
±n.n(小数形式)
±n E ±m(指数形式)
±n.n E ±m (指数形式)

如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。

…………
双精度浮点数(double)
用8个字节(64位)存储空间,包括符号位1位,阶码11位,尾数52位。

其它类似。



回复

使用道具 举报

发表于 2014-1-2 20:20 | 显示全部楼层
更详细一点:

二进制浮点数的表示,按美国IEEE(电子及电子工程师协会)表示方法,
称之为IEEE标准754(IEEE,1985),当今流行的计算机几乎都采用这一标准。

IEEE 754在标识符点数时, 每个浮点数均由3个部分组成:
符号位S,指数部分E和尾数部分M。

浮点数可采用以下四种基本格式:
(1)单精度格式(32位):E=8位,M=23位。
(2)扩展单精度格式:E≥11位,M≥31位。
(3)双精度格式(64)位:E=11位,M=52位。
(4)扩展双精度格式(64位):E≥15位,M≥63位。

其中,单精度格式(32位)中的阶码为8位, 另有一位尾数的符号位S,处在最高位。
浮点数的分数部分与有效位部分两者是不同的,
由于IEEE754标准约定在小数点左部有一位隐含位,从而使其有效位实际有24位,
这样便使尾数的有效值变为1M。

阶码部分采用移码表示, 移码值为127,从而使阶码值的范围由原来的1到254,经移码后变为-126到+127。

…………
下面举两个例子来说明IEEE 754标准浮点数的表示:
(1)N=-1.5,它的单精度格式表示为:1 01111111 10000000000000000000000
其中,S=1,E=127,M=0.5,
因此N=-1.5。

(2)以下的32位数所表示的单精度浮点数:
1 10000001 01000000000000000000000
其中,S=1,E=129,M=0.25,由公式可知N=-5。

回复

使用道具 举报

发表于 2014-1-2 20:24 | 显示全部楼层
一个浮点数a由两个数m和e来表示:a = m × b^e。

在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。
m(即尾数)是形如±d。ddd。。。ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。

如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。


回复

使用道具 举报

发表于 2014-1-2 20:28 | 显示全部楼层
 对于内部存储数据(00111111 01100110 01100110 01100110)2:
   符号位 (最左侧)S=0。这表示是个正数
   指数  (左侧第2-9位)E=(01111110)2=(126)10,所以e=E-127=-1。
   尾数  (最后的23位)M=(1100110 01100110 01100110)2
            m=(1.M)2=(1.7999999523162841796875)10

  该二进制小数转为10进制的计算方式为:
     1 + (1/2+1/4) + (1/32+1/64) + (1/512+1/1024)……
  实际值 N=1.7999999523162841796875*2^-1=0.89999997615814208984375
  
    (其实,这个数据是0.9的 单精度浮点数 的实际内部存储,可以看到有一定的误差)
 

 这里继续给出另外几个数字的实例:
  使用竖线|将各个段位分隔显示
  实际值 | 符号位 | ;指数 | ;尾数
  1 | 0 | 01111111 | 00000000000000000000000
  2 | 0 | 10000000 | 00000000000000000000000
  ⒍5 | 0 | 10000001 | 10100000000000000000000
  -6.5 | 1 | 10000001 | 10100000000000000000000
回复

使用道具 举报

发表于 2014-1-2 20:29 | 显示全部楼层
表示范围
  最大表示范围:单精度浮点数可以表示的范围为±3.40282 * 10^38( 1.1111...1×2^127)
  接近于0的最小值:单精度浮点数可以表示1.175 * 10-38(1.00...0×2^-126)的数据而不损失精度。
  当数值比以上值小的时候,将会由于尾数的有效位数减少而逐步丧失精度(IEEE 754的规定),或者有的系统则直接采用0值来简化处理过程。

精度
  单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为2^23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2^24的数值变化,即24位二进制精度)

误差
  浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。
  特定精度下看似相等的两个浮点数可能并不相等,因为它们的最小有效位数不同。
  由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。
  如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。
回复

使用道具 举报

发表于 2014-1-2 20:40 | 显示全部楼层
条件中如果用到浮点数要小心。
如:msgbox 0.1=1.1-1    msgbox 0.2=1.2-1  ……直到msgbox 0.9=1.9-1 看一下共有多少false多少true
回复

使用道具 举报

发表于 2014-1-2 20:56 | 显示全部楼层
因此最大数是 1*2^128=340282366920938463463374607431768211456
实际取7位有效数=3.402823E+38



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 15:46 , Processed in 0.386665 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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