中易网

如何让用科学计数法表示的数据还原

答案:1  悬赏:0  
解决时间 2021-11-18 03:52
如何让用科学计数法表示的数据还原
最佳答案
浮点数  浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 <br>  浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。 <br>  一个浮点数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是指数。<br>  由此可以看出,在计算机中表示一个浮点数,其结构如下:<br>  尾数部分(定点小数) 阶码部分(定点整数)<table><tbody><tr><td>数符±</td><td>尾数m</td><td>阶符±</td><td>阶码e</td></tr></tbody></table><br>  这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。 <br>  例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。 <br>  此外,浮点数表示法通常还包括一些特别的数值:+∞和?∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。<br>  众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外。然而浮点数的二进制表示法却不像定点数那么简单了。 <br>  先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。 <br>  C++中的浮点数有6种,分别是: <br>  float:单精度,32位 <br>  unsigned float:单精度无符号,32位 <br>  double:双精度,64位 <br>  unsigned double:双精度无符号,64位 <br>  long double:高双精度,80位 <br>  unsigned long double:高双精度无符号,80位(嚯,应该是C++中最长的内置类型了吧!) <br>  然而不同的编译器对它们的支持也略有不同,据我所知,很多编译器都没有按照IEEE规定的标准80位支持后两种浮点数的,大多数编译器将它们视为double,或许还有极个别的编译器将它们视为128位?!对于128位的long double我也仅是听说过,没有求证,哪位高人知道这一细节烦劳告知。 <br>  下面我仅以float(带符号,单精度,32位)类型的浮点数说明C++中的浮点数是如何在内存中表示的。先讲一下基础知识,纯小数的二进制表示。(纯小数就是没有整数部分的小数,讲给小学没好好学的人) <br>  纯小数要想用二进制表示,必须先进行规格化,即化为 1.xxxxx * ( 2 ^ n ) 的形式(“^”代表乘方,2 ^ n表示2的n次方)。对于一个纯小数D,求n的公式如下: <br>  n = 1 + log2(D); // 纯小数求得的n必为负数 <br>  再用 D / ( 2 ^ n ) 就可以得到规格化后的小数了。接下来就是十进制到二进制的转化问题,为了更好的理解,先来看一下10进制的纯小数是怎么表示的,假设有纯小数D,它小数点后的每一位数字按顺序形成一个数列: <br>  {k1, k2, k3, ... , kn} <br>  那么D又可以这样表示: <br>  D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ... + kn / (10 ^ n ) <br>  推广到二进制中,纯小数的表示法即为: <br>  D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n ) <br>  现在问题就是怎样求得b1, b2, b3,……,bn。算法描述起来比较复杂,还是用数字来说话吧。声明一下,1 / ( 2 ^ n )这个数比较特殊,我称之为位阶值。 <br>  例如0.456,第1位,0.456小于位阶值0.5故为0;第2位,0.456大于位阶值0.25,该位为1,并将0.45减去0.25得0.206进下一位;第3位,0.206大于位阶值0.125,该位为1,并将0.206减去0.125得0.081进下一位;第4位,0.081大于0.0625,为1,并将0.081减去0.0625得0.0185进下一位;第5位0.0185小于0.03125…… <br>  最后把计算得到的足够多的1和0按位顺序组合起来,就得到了一个比较精确的用二进制表示的纯小数了,同时精度问题也就由此产生,许多数都是无法在有限的n内完全精确的表示出来的,我们只能利用更大的n值来更精确的表示这个数,这就是为什么在许多领域,程序员都更喜欢用double而不是float。 <br>  float的内存结构,我用一个带位域的结构体描述如下: <br>  struct MYFLOAT <br>  { <br>  bool bSign : 1; // 符号,表示正负,1位 <br>  char cExponent : 8; // 指数,8位 <br>  unsigned long ulMantissa : 23; // 尾数,23位 <br>  }; <br>  符号就不用多说了,1表示负,0表示正 <br>  指数是以2为底的,范围是 -128 到 127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,其行为和X86架构的CPU处理加减法的溢出是一样的。<br>  比如:127 + 2 = -127;-127 - 2 = 127 <br>  尾数都省去了第1位的1,所以在还原时要先在第一位加上1。它可能包含整数和纯小数两部分,也可能只包含其中一部分,视数字大小而定。对于带有整数部分的浮点数,其整数的表示法有两种,当整数大于十进制的16777215时使用的是科学计数法,如果小于或等于则直接采用一般的二进制表示法。科学计数法和小数的表示法是一样的。 <br>  小数部分则是直接使用科学计数法,但形式不是X * ( 10 ^ n ),而是X * ( 2 ^ n )。拆开来看。 <br>  0 00000000 0000000000000000000000 <br>  符号位 指数位 尾数位
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
大兴长途站那的火车票代售点几点下班?
刚成立的分公司,没有注册资金,验资报告要怎
公主坟附近的水吧或者安静的地方
地热清洗机工作原理是怎么样的?
三菱重工srfg50i空调报价咋样?
三星m608手机最新报价多少?
法网狙击第5 集 地点在哪条街
4米伸缩梯价格是多少?
这两种分手方式哪种对男人更遗憾
帮忙翻译:请通知你在中国的货运代理与我联系
1周2個月寶寶高燒39.5度手腳涼怎麼辦
半球电器 我现在想代理一个小家电的品牌电器
进入秋季有些口干嗓子不舒服该怎么办?
品牌羽绒服和普通丝绵价格相差三倍以上,但感
玻尿酸垫下巴会花多少钱
推荐资讯
怎样才能在短时间内长高??
求哈利波特好看的同人文
创新usb声卡价格多少?
云南旅游都有哪些注意事项呢?十二月份想去云
艾默生高压变频器原理是什么?
泊头哪里招工
92zg001抗震构造柱及圈梁谁了解?
形容人的英语词汇(如聪明等)
谁能说一下花洒哪个牌子质量好
丁一宇有磨骨吗 整容过吗
恒瑞网络地址有知道的么?有点事想过去
北京房山擦玻璃公司哪家最专业?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?