c语言 单浮点型 和双浮点型 有什么区别 最好能扩展的讲讲

c语言 单浮点型 和双浮点型 有什么区别 最好能扩展的讲讲,第1张

精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。
这是一些声明单精度浮点型变量的例子:float hightemp,lowtemp;
双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。在一些现代的被优化用来进行高速数学计算的处理器上双精度型实际上比单精度的快。所有超出人类经验的数学函数,如sin( ),cos( ) ,和sqrt( )均返回双精度的值。当你需要保持多次反复迭代的计算的精确性时,或在 *** 作值很大的数字时,双精度型是最好的选择

单精度数是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3402823E38 到 -1401298E-45,而在正数的时候是从 1401298E-45 到 3402823E38 。

单精度浮点数和双精度浮点数的要求:

精度主要取决于尾数部分的位数,float为23位,除去全部为0的情况以外,最小为2的-23次方,约等于119乘以10的-7次方,所以float小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位。  类似,double 尾数部分52位,最小为2的-52次方,约为222乘以10的-16次方,所以精确到小数点后15位,有效位数为16位。

浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。现在大多数机器都是32位的,也就是说32位都用来表示整数的话,那么对于无符号整数就是0 到 2^32-1,对于有符号的话就是-2^31 到 2^31-1。
浮点运算使用三种不同的数据:
1)整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Integer)
2)实数(Real)分单精度(Single Real)和双精度(Double Real)
3)压缩的二十进制数(BCD)

单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。

求教,今天学习突然发现个问题,同样的代码,一个申明变量为单精度浮点型,一个申明变量为双精度浮点型,但是结果却不一样

a=311999988555908

b=312

代码:

Sub test2()

Const a As Single = 312

Const b As Double = 312

Range("A1") = a

Range("B1") = b

End Sub

结果在excel中如图

这样的话定义单精度浮点型不是没用,以后小数不是都要定义为双精度浮点型了吗?

浮点数的误差是一定存在,并且无法消除。
永远不要直接比较两个浮点数。比较的时候要先round。
把电脑中的浮点运算误差找出来 - 任何人的电脑都会有这个误差的

很多人在日常使用Excel,可能都没有注意到浮点小数带来的计算误差问题
因为日常使用的运算结果,肯定都是四舍五入之后的结果,可以排除浮点误差的影响
但是,浮点小数的误差,也会出现在运算的过程,有可能导致最终结果出错。
比方说 countif(A1:A10000,"=B1")这样的简单统计,也有可能出错。
附件生成5万个随机小数(四舍五入到2位小数位),加上然后马上减去同一个整数
对比计算前后的数值是否相等(数学上当然是绝对相等的,但是电脑的运算结果就不一定了。。。。。。)
附件会自动找出一批在你的电脑上会出现浮点小数误差导致错误的运算。
出现浮点小数运算误差的原因很简单,小数有无穷多个
甚至一个小数也有无穷多位,如十进制的1/3,或者二进制的01
所以计算机存储小数的时候,必定只能存储所有小数的一部分,而无穷小数则必须截断
因此,一个小数有时候就只能取一个接近值而不是精确值
而对应的浮点数运算,也只能得到接近值,而不是精确值
不同的CPU,比方说Intel的跟AMD的,或者奔腾跟赛扬,在硬件上对于截断的位置是不一样的
所以,同一个运算在不同的机器就可能有不同的结果
这也是为什么论坛经常有人说xx运算不正确,然后回帖的人说我的机器没事,其实就是CPU不同而已
另一方面,不同的软件,内部计算的时候,也许用了不同的CPU硬件实现的数据类型,或者精度设置也不一样,
所以,同一个运算在不同的软件也可能有不同的结果
编程,写公式要注意,假设 x,y 都是浮点数,er。。。。。。excel的每个小数单元格都是浮点数
那么永远不要写 if x=y 这样的句子,因为很可能数学上相等的x和y,在计算机内部是不等的
应该写成 if |x-y| / max(|x|,|y|) <= 00000000000001 之类
或者简单一点,用if round(x) = round(y) 来判断,这样最末一位的尾数浮点存储误差就不会影响整个数值了。
幸运的是,整数和定点小数不会受影响,编程时应该优先考虑使用整数和定点小数类型
另一方面,即使浮点小数可以完全表示我们要计算的数值,但是计算结果却也有可能产生误差
浮点,定点的意思是指小数点的位置
定点小数:小数点位置固定。
以十进制为例,假设一个数值类型可以有6个十进制位置,那么定点类型无须记录小数点位置,可以有以下类型:
整数类型,小数点位置就一定是个位后面,能够表达的最精确数字就是1,能够表达的范围是 000000 - 999999
两位小数类型,小数点位置就一定是百分位,能够表达的最精确数字就是001,,能够表达的范围是 000000 - 999999
。。。。。。等等
浮点小数:小数点位置可以变动,并且需要额外的记录去描述这个变动的小数点位置。
假设这里把其中一个位置用于记录小数点位置(可变范围 0-9),并且规定:
小数点位置取5,表示精度是1,小数点在个位后面,这个数值类型有0个小数位,可以表示 00000 到 99999 的数 (注意:这里只有5位有效数字)
小数点位置取6,表示精度是 01,小数点在十分位后面,这个数值类型有1个小数位,可以表示 00000 到 99999 的数
小数点位置取9,表示精度是 00001,小数点在万分位后面,这个数值类型有4个小数位,可以表示 00000 到 99999 的数

小数点位置取4,表示精度是 10,表示小数点在十位,这个数值类型可以表示 00000 x 10 到 999990 的数,精度是 10

小数点位置取0,表示精度是 100000,表示小数点在十万位,这个数值类型可以表示 00000 x 100000 到 9999900000 的数,精度是 100000
可见浮点小数通过可变的小数位置,使一个数值类型可以用一部分表示有效数字,另一部分表述每一单位有效数字的倍率
从而灵活地表示很大范围的数值,代价是:由于用了一部分记录内容去记录小数点位置,所以有效数字的长度比定点小数要低。
而且,一些定点数运算不会出现的问题,在浮点数运算会出现
如两个数相加
如果第一个浮点数是 10001,第二个浮点数是 9999900000
按上述规则,这两个都是合法的浮点数,可是它们的和 9999900010001 却无法用同一个浮点数类型表示出来。
一般计算机碰到这种情况,就会自动按比较大的数值来四舍五入,于是
10001 + 9999900000 = 9999900000 (出现了10001的误差)
这也是浮点数误差产生的一个原因:小的数值被大的数值“吸收”了。
要在Excel证明这一点就太简单了,因为excel的double类型浮点小数只有15个有效数字(即最多记录15个十进制数字)
所以Excel的单元格运算 12345012345678900000 + 123450123456789 = 12345012345678900000

-----------------------------------------------------------

VBA单精度浮点型Single与双精度浮点型Double的区别

浮点型说白了就是科学记数法

单精度浮点型(single)

在C++中,单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。

在foxpro中,单精度浮点型是为了提供兼容性,浮点数据类型在功能上等价于数值型。

在VB中,Single 数据类型 Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3402823E38 到 -1401298E-45,而在正数的时候是从 1401298E-45 到 3402823E38。6位有效位数

Single 的类型声明字符为感叹号 (!)。

双精度(double)型

C语言中,双精度(double)型占8 个字节(64位)内存空间,其数值范围为17E-308~17E+308,可提供16位有效数字。 

Single 最多可以显示小数点后面7位 Double 最多可以显示小数点后面14位
Single 数据类型
Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3402823E38 到 -1401298E-45,而在正数的时候是从 1401298E-45 到 3402823E38。Single 的类型声明字符为感叹号 (!)。
Double 数据类型
Double(双精度浮点型)变量存储为 IEEE 64 位(8 个字节)浮点数值的形式,它的范围在负数的时候是从 -179769313486232E308 到 -494065645841247E-324,而正数的时候是从 494065645841247E-324 到 179769313486232E308。Double 的类型声明字符是数字符号 (#)。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12938360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存