




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C#浮点数精度丢失问题C#中的浮点数,分单精度(float )和双精度(double ):float 是System.Single 的别名,介于-3.402823e38和+3.402823e38之间的32位数字,符合二进制浮点算法的IEC 60559:1989(IEEE754 标准;double 是System.Double 的别名,介于-1.79769313486232e308和+1.79769313486232e308之间的64位数字,符合二进制浮点算法的IEC 60559:1989(IEEE754 标准;我们知道,计算机只认识0和1,所以数值都是以二进制的方式储存在内存中的。(对于人脑和
2、计算机哪个聪明,个人更倾向于选择人脑,计算机只是计算得快,而且不厌其烦而已!)所以要知道数值在内存中是如何储存的,需先将数值转为二进制(这里指在范围内的数值)。根据IEEE 754标准,任意一个二进制浮点数V 均可表示为:V =(-1s *M *(2e 。其中s 0,1;M 1,2 ;e 表示偏移指数。整数部分可采用" 除2取余法" ,小数部分可采用" 乘2取整法" 。从结果可以看出,小数部分0.19转为二进制后,小数位数超过16位(我已经手算到小数点后32位都还没算完,其实这个位数是无穷尽的)。由于无法得到完全正确的数值,这里就引申出浮点数精度丢失的问
3、题:/*程序段1*/float num_a=198903.19f;float num_b=num_a/2;Console.WriteLine(num_a;Console.WriteLine(num_b;这里介绍另一种转小数部分的方法,有兴趣可以看下:假如结果要求精确到N 位小数,那么只需要将小数部分乘以2的N 次方(例如N =16,0.19*(216 ,得到12451.84)。可以看出,若是小数部分乘以2的N 次方后,可以得到一个整数,那么这个小数可以用二进制精确表示,否则则不可以。(原理很简单,根据二进制小数位转十进制的方法,反推回去就可以得到这个结果)在内存中,float 和double
4、的储存格式是一致的,只是占用的空间大小不同。float 总共占用32位: 从左往右,第1位是符号位,占1位;第2-9位是指数位,占8位;第10-32位是尾数位,占23位。double 总共占用64位,从左往右第1位也是符号位,占1位;第2-12位是指数位,占11位;第13-64位是尾数位,占52位。其中,符号位(即上文的s ,下同),0代表正数,1代表负数。对于float ,8位指数位的值范围为0-255(10,由于指数(即上文的e ,下同)可正可负,而指数位的值是一个无符号整数。根据标准规定,储存时采用偏移值(偏移值为127)的方法,储存值为指数+127。例如01110011(2表示指数-1
5、2(10((-12+127=115),10001011(2表示指数12(10(12+127=139)。另外,IEEE 754规定(同样适用于double ):当指数全为0时,如果尾数全为0,表示±0(正负取决于符号位),如果尾数不全为0,计算时指数等于-126,尾数不加上第一位的1,而是还原为0.xxxxxx 的小数,表示更接近0的小数;当指数全为1时,如果尾数全为0,表示±无穷大(正负取决于符号位),如果尾数不全为0,表示这不是一个数(NaN )。同样的,对于double ,11位指数位,储存时采用的偏移值为1023。尾数位,由于所有数值均可以转换成1.xxx *(2N
6、(此处暂时忽略精度问题),所以尾数部分只保存小数部分(最高位的1不存入内存,提高1个位的精度)。指数是17,保存为144(17+127=144),即10010000(共8位,不足8位在高位用0补足);float f_num=198903.19f;var f_bytes=BitConverter.GetBytes(f_num;Console.WriteLine("float:198903.19"Console.WriteLine(BitConverter.ToString(f_bytes;Console.WriteLine(string.Join("",
7、f_bytes.Select(i=>Convert.ToString(i,2.PadLeft(8,'0' double d_num=198903.19d;var d_bytes=BitConverter.GetBytes(d_num;Console.WriteLine("double:198903.19"Console.WriteLine(BitConverter.ToString(d_bytes;Console.WriteLine(string.Join("", d_bytes.Select(i=>Convert.ToString(i,2.PadLeft(8, '0' 回到精度丢失的问题,由于小数位无法算尽,内存用截取精度的方式储存了转换后的二进制,这导致
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公务员省考表述艺术试题及答案解读
- 2024调酒师考试中突发事件应对-试题及答案
- 热循环的应用实例试题及答案
- 2024年记者证考试提示与试题及答案
- 多媒体应用设计与品牌传播的关系试题及答案
- 二级建造师考试有效学习策略试题及答案
- 2024年税务师考试知识网络试题答案
- 2024年食品安全员复习策略试题及答案
- 2024年珠宝鉴定师考试高分策略试题及答案
- 实战模拟 公务员省考试题及答案
- 急性心房颤动中国急诊管理指南(2024)解读
- 小学二年级有余数的除法口算题(共300题)
- 区域医学检测中心的建设与管理V3
- 林下中药材种植项目可行性研究报告
- 2025年中国岩棉行业发展现状、市场前景、投资方向分析报告(智研咨询发布)
- 经销商管理制度(15篇)
- 高温熔融金属企业安全知识培训
- 技能竞赛(电工电气设备赛项)备考试题库(含答案)
- 二年级上册劳动《洗红领巾》课件
- 外出进修后回院汇报
- 《我的鞋带我会系》小学劳动教育课件
评论
0/150
提交评论