<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們都知道單精度浮點數(Single,float,Real)由32位元0或1組成,它具體是如何來的。
浮點數的32位元N=1符號位(Sign)+8指數位(Exponent)+23尾數部分(Mantissa)
using System; using System.Collections.Generic; using System.Linq; namespace ConverterAndPrecisionDemo { class Program { static void Main(string[] args) { //參考部落格:https://blog.csdn.net/zhengyanan815/article/details/78550073 //小數點後面:4個位佔用一個數位【十進位制9就是1001】 //符號位(Sign) : 0代表正,1代表為負【佔1位】 //指數位(Exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存【佔8位元】 //尾數部分(Mantissa):尾數部分【佔23位】 //單精度float:N共32位元,其中S佔1位,E佔8位元,M佔23位。因此小數點後最多精確到23/4=6位 //雙精度double:N共32位元,其中S佔1位,E佔11位,M佔52位。因此小數點後最多精確到52/4=13位 //十進位制小數的二進位制表示:【法則--整數部分:除基取餘,逆序拼接。小數部分:乘基取整,順序拼接】 //整數部分:除以2,取出餘數,商繼續除以2,直到得到0為止,將取出的餘數逆序。可以使用棧Stack //小數部分:乘以2,然後取出整數部分,將剩下的小數部分繼續乘以2,然後再取整數部分,一直取到小數部分為零為止。如果永遠不為零,則按要求保留足夠位數的小數,最後一位做0舍1入。將取出的整數順序排列。可以使用佇列Queue float f = 123456.8125F; byte[] buffer = BitConverter.GetBytes(f); Console.WriteLine("列印浮點數對應的4個位元組:"); Console.WriteLine(string.Join(",", buffer)); Console.WriteLine($"【使用函數】{123456}對應的二進位制:{ Convert.ToString(123456, 2)}"); int num = 123456; Stack<int> stack = new Stack<int>(); while (num != 0) { int cur = num % 2; stack.Push(cur); num = num / 2; } Console.WriteLine($"【使用堆疊】{123456}對應的二進位制:{ string.Join("", stack)}"); int scale = 10; int index = 0; double d = 0.8125; Queue<int> queue = new Queue<int>(); while (index < scale) { int cur = (int)(d * 2); queue.Enqueue(cur); d = d * 2 - cur; if (d == 0) { break; } index++; } Console.WriteLine($"{0.8125}對應的二進位制:{ string.Join("", queue)}"); string binaryDisplay = string.Join("", stack) + "." + string.Join("", queue); Console.WriteLine($"{123456.8125}對應的二進位制為{binaryDisplay}"); int dotIndex = binaryDisplay.IndexOf('.'); //移除小數點後將小數點插入索引1的位置【即:小數點移動到索引1的位置】 string scienceDisplay = binaryDisplay.Remove(dotIndex, 1).Insert(1, "."); Console.WriteLine($"小數{123456.8125}對應的二進位制科學計數為{scienceDisplay}×(2的{dotIndex - 1}次方)"); string sign = (f > 0 ? "0" : "1");//符號位佔用1位 Console.WriteLine($"符號位S:正數為0,負數為1。符號位是:{sign}"); string exponent = Convert.ToString(127 + (dotIndex - 1), 2).PadLeft(8, '0');//指數位佔用8位元 Console.WriteLine($"指數位E:123456最高位為2的{dotIndex - 1}次方,指數為{dotIndex - 1},因此指數位E的十進位制值為【127+{dotIndex - 1}={127 + dotIndex - 1}】"); //尾數部分:去除scienceDisplay開始的"1.",也就是字串從索引2開始。並湊夠23位 string mantissa = scienceDisplay.Substring(2).PadRight(23, '0');//尾數位佔用23位 Console.WriteLine($"尾數位M:尾數部分M需要湊夠23位。為【{mantissa}】"); string joinBits = sign + exponent + mantissa;//符號位佔用1位+指數位佔用8位元+尾數位佔用23位=32位元 byte[] bufferJoin = new byte[4]; for (int i = 0; i < 4; i++) { bufferJoin[i] = Convert.ToByte(joinBits.Substring(8 * i, 8), 2); } Console.WriteLine("重新拼接形成的32位元浮點數,對應的4個位元組為:"); Console.WriteLine(string.Join(",", bufferJoin)); byte[] reverseBuffer = bufferJoin.Reverse().ToArray(); Console.WriteLine("反轉陣列bufferJoin的順序:重新列印我們會發現與浮點數原始的位元組完全一致。注意:C#是低位元組在前"); Console.WriteLine(string.Join(",", reverseBuffer)); Console.ReadLine(); } } }
對於一個系統可能出現一些特別大的數和特別小的數,如果用定點表示就會很僵硬,位數一定就不能同時表達特別大的數和特別小的數。
用科學計數法的方式可以寫成1.23625*10^2,也可以寫成12.625*10^1或1.111011101*2^6。。。。。為了規範,IEEE就規定了32位元浮點的格式如下
(1)最高位是符號位,“0”代表正,“1”代表負。
(2)接下來的8位元是指數位,8位元可表示整數的範圍是0-255,考慮指數可以是負的,IEEE規定在上面的範圍減去127,並將-127(全0)和128(全1)用做特殊值處理,所以指數的位的範圍是(-127,128)。
(3)最低的23位是小數位(尾數位),正常是可以表示23位的範圍,但是IEEE規定小數點左側必須為1,右側位數不夠補0。這樣可以就可以省略1,可以用23位來表示24位元。
eg. 1.111011101*2^6中,小數位是111011101+補14個0
科學計數法=1.111011101*26(整數部分:123=01111011b,小數部分:0.625=0.101b,整數部分除2取餘,倒序排列,高位補零;小數部分乘2取整,順序排列)
符號位:0
指數位:6+127=10000101
小數位:11101110100000000000000
即:01000010111101110100000000000000=0x42F74000
42F74000=01000010111101110100000000000000,拆分為符號位、指數位、小數位。
(1)符號位:0
(2)指數位:10000101=133,實際指數=133-127=6
(3)小數位:11101110100000000000000去掉後面的0、前面補1為1. 111011101
即科學計數法表示為1. 111011101*26=(2^0+2^-1+2^-2+2^-3+2^-5+2^-6+2^-7+2^-9)*2^6=123.625。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45