- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
假數的奧秘(上).doc
假數的奧秘 (上)
■溫嘉榮
有一次上課的時候,我曾以上面的例子來問學生,結果同學們都被我這突如其來的妙問給考倒了。基本上,上面這個題目應該是無解的,也就是說在數的理念上應該不會有一個數加上1之後還跟原來的數相等,遺憾的是電腦在表示數值方面產生了漏洞,使這個原來不可能的事竟然在人們號稱二十世紀最偉大的產物“電腦”上發生了。記得有人曾經說過電腦固然威力無比,可是卻無法完整的表達一個簡單的數的實質內涵。這句話像是在提醒我們電腦並沒有想像中那麼“神”,對電腦應有正確的認識,而不要錯估了電腦的能力。
上面的問題如果你在第10行設定A你會發現電腦執行後印出的就是A=B ,那麼你是不是認為電腦竟然把B斷成和A等,你的想法沒錯!電腦確實把AB斷為相等,現在你會開始懷疑電腦的演算能力了,竟然連這樣ㄧ個簡單的數都搞錯,實在是鬧笑話!
其實這裡面暗藏著玄機,要深入探討這個問題我們必須從數的表示法開始談起,以便確實了解電腦是如何處理和表示數值。
數值資料表示法
電腦處理數值資料是根據數值來區分為整數和實數二類。整數存在電腦內部時,一般是以定點( Fixed Point )方式表示;而實數資料即含有小數的資料,通常多以浮點( Floating Point )方式表示。
。定點表示法
定點表示法是因為把小數點假想成固定在數值的特定位置而稱之為“定點表示”。以GWBASIC為例,其整數是以2個位元組( 2 bytes = 16 bites )來表示,如圖1 其假想小數點的位置是定在最右端。定點式表示法中又有幾種不同的表示
15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 ┌───────b2───────┐ ┌───────b1──────┐
圖1 整數資料表示法
方式,而GWBASIC是採用最常用的2’S 補數( 2’S complement )表示法。由於數值一般均帶有正負符號,所以通常都將數值的最左邊位元視為正負符號的位元,即Sign Bit,當該B15 = 0時,表示該數位為正值;當該B15 = 1時,表示該數值為負值。2’S 補數表示法其記憶體中二位元整數資料的換算過程是:
(1) 如果數值是正數,則記憶中儲存的就是其原來數值,直接換算即可。
(2) 如果數值是負數,則必須先將記憶中的值先轉換成2’S補數,再換算原值。
這裡我們必須先把2’S 補數的觀念說明一下,電腦在執行算術運算時,基本上是可以只擁有加法運算的硬體電路,便能執行加減乘除等四種算術運算,而減法運算可以採用補數的觀念完成,譬如運算A-B 時,就將A加上B的二補數,便可以達到減法的效果,乘法運算可運用累加,而除法運算可運用累減來完成。2’S補數的運算法則如下:
某數的2’S補數相當於某數的1’S補數再加上1。而某數的1’S 補數相當於將某數位元中所有的0變成 1;1 變成0。
這兒我們舉二個例子來說明定點數的資料換算:
(1) 設若二個位元組的整數資料為 (0)10 (10)10 時該數的二近位資料為000000000001010,資料最左邊 (即第一位元) 為0,表示該數為正數,則直接將該數轉換成十進制,即該數值為 0×256+10 = 10 。在GWBASIC底下可以用下面的程式叫出資料數值,注意GWBASIC資料的高低位元組次序顛倒,所以先印出10,再印出0。
(2) 設若二個位元組的整數資料為(255)10 (244)10 時該數的二進位資料為1111111111110100資料最左邊 (即第一個位元)為1,表示該數為負數,則必需先將該數轉換成2’S補數。
原數 = 進位資料 ──→ 0與1互變結果 ──→ 0000000 再加上1後成為 ──→ 0000000 (此數即為原數的2’S 補數)
該數值在十進制應為0與12,即該數為 – ( 0×256+12 ) = -12。在GWBASIC底下再用和上面同樣的程式叫出資料,印出的數位是244 255 (高位元對調),便是-12所存放的資料。
如果你仔細分析便會發現用二個位元組來表示整數,其範圍是從-32768至32767,基本上在這個範圍內其資料與所表達的數值完全精確,但是實數的表示卻不然。理論上,以四個位元組(即32個位元) 的有限資料要想表達一個精確度超過32位二進制資料所能處理的能力時,問題就出現了。因此實數在電腦上一般都以浮點數表示。
。浮點數表示法
浮點數因為其所存放的
文档评论(0)