電算機概論

      在〈電算機概論〉中尚無留言

2進位轉10進位

假設有一組二進位數字 1 0 1 1 1 0 0 1, 要將此數字轉成10進位, 則在每個二進位的下方, 註記 20, 21, …., 然後將其值與2進位每格數字相乘, 再加總

1 0 1 1 1 0 0 1
27 26 25 24 23 22 21 20
128 0 32 16 8 0 0 1

由上表可知, 27*1=128, 25*1=32, ……所以 128+32+16+8+1=185

因此 10111001的十進位就是185

10進位轉2進位

比如一個十進位數字 185 , 只要使用如下方式一直除以2, 直到結果為1為止, 然後由下方往上方列出餘數就是二進位  1 0 1 1 1 0 0 1

dtob

位元與位元組

1 個二進位稱為一個位元(bit), 八個二進位組合成1 個位元組(byte)

byte

正負數

使用最前面的 1 個 bit, 如果是 0 就表示為正數, 如果是1 就表示為負數

pn

所以只剩下 7 位二進位數, 當後 7 位都填為 1 且第 1 位為 0, 表示為127, 當後 7 位都是1 且第1位為1, 則表示為-1

max

範圍值

16bit : -32768 ~ 32767

32bit : -21億 ~ 21 億

64bit : -263 ~ 263

冪次方

冪次方是一個神奇的東西,  比如 42 = 4*4, 53=5*5*5

數學上, 乘法總是比加法複雜, 如果有個方法可以把乘法變成加法來運算的話, 這天下就美滿了. 幸運的是, 還真的有這種方法.  比如 1024*512, 這個要動動筆吧
1024*512 = 210*29 = 219
如何呢, 上面的指數, 直接變成相加的即可

即然有 53, 52, 51, 那 50呢, 答案是 1.
那是否有5-1呢!! 有的, 答案是 1/5, 5-2就是 1/25

小數

二進位的小數和十進位的小數在觀念上完全一樣, 必須有一個小數點, 小數點的左邊是整數, 小數點的右邊是小數, 每一位數有它的權重, 例如下圖:

number

在電腦裡表達小數的方式有兩種, 一種是定點表示法, 一種是浮點表示法

定點小數表示法(fixed point)

在電腦裡資料以位元來存放, 而小數點並不需要真的存放在位元內, 我們只要知道哪兩個位元之間是小數點就好了

使用定點表示法來表達小數時會將小數點都固定在一個地方, 而不會變來變去, 這也是為什麼要叫做定點小數的原因

定點小數表示法裡加減法就是二進位的標準加減法, 而乘法必須要把小數點移回來

高階程式語言內一般都不用定點小數表示法, 因為定點小數表示法所能表示數字的範圍非常有限, 例如上面雙位元組小數點置於第 8 位和第 9 位元之間時, 只能表示 0 到 255 之間每隔 1/256 的那些數字而已. 這樣子範圍的數字在自然界中應用的機會較小, 那為什麼要用這種方式表示小數呢?? 簡單地說就是運算速度較快, 定點小數的運算就是標準二進位的運算, 因此很簡單, 硬體製作起來也很便宜

十進位的小數使用二進位定點表示法時, 可能會有誤差, 比如十進位的 0.1 使用二進位表示時是 0.000110011001100110011… 的一個循環小數, 以上圖的表示法來說小數以下只能表示八位數, 也就是 0.00011001, 這個數字和原來希望表示的數字會有一點點的誤差, 讓我們把這個數字換回十進位來看看, 也就是 1/256 + 1/32 + 1/16 = 25/256 = 0.09765625, 只能很接近 0.1. 誤差一定小於 1/256,  而且有一個特性就是實際表達出來的數字的絕對值永遠小於或是等於原來要表達的數字的絕對值

浮點小數表示法

二進位的浮點小數表示法 (或是浮點數, floating point number) 和我們十進位中常用的科學記號表示法類似. 十進位中我們用10的冪次 (power) 及 0 至 1 之間的小數來表示一個任意的實數, 如 12345.6789 可以寫成 0.123456789 * 105

在二進位中我們一樣可以將一個二進位數字 1101110.11011 表示為 0.110111011011 * 27, 這樣的表示法和定點表示法有什麼不同嗎? 這兩個數值的大小當然是完全一樣, 但定點小數表示法中我們看到它的缺點是絕對值太大的數字會被截斷(溢位overflow), 位數不夠多無法表達大於範圍的數字, 絕對值太小的數 (0.000000001) 也會被截斷 (無條件捨去法truncation) 只能表達近似的值

想一下底下二個問題

1. 對於一個很大的數字 (123456789012) 定點表示法保証小數點以後一定有固定的幾個位數來表示 (例如00000011), 可是這樣子的精確度對於大部份的應用來說是沒什麼意義. 試想太陽到地球的距離多一公里少一公里真的有關係嗎? 光速每秒鐘快一公尺又何妨?

2. 對於一個很小的數字 (例如0000000012) 來說定點表示法可能因為小數點後沒有足夠的位數來記錄而將其省略. 上面這個數字就變成 0 了. 如果水中含有 0.0000000012 莫耳的氰化鈉, 這是會喝死人的. 但因為小數點後位數不足而把它當為 0, 這下又喝不死人了.

此時浮點數表示法就有其功用了. 以第一例中一個很大的數字而言, 浮點數由最重要的位數開始只保留一定的位數, 例如 123456789012.00000011 可用 0.1234567890 * 1012 來表示就夠了, 這個表達方法所記錄的數字和實際的數字會有誤差, 但是百分比誤差不大. 以第二例而言, 0.0000000012 可用 0.12 * 10-8 來表示, 不需浪費許多位元記錄 “0”, 只需記 12 以及 -8 即可精確地表達這個很小的數字

32位元二進位浮點表示法(float), 以1個位元記錄正負號, 7個位元記錄 2 的冪次, 24 個位元記錄小數, 共 32 位元, 如下圖所示

number2

若有一個以此種表示方法的二進位數值:

0 0001110 110000000000000000000000

代表十進位的 0.75 * 214

時間膨脹

$(\Delta t’=\gamma \Delta t=\frac{\Delta t}{\sqrt{1-v^{2}/c^{2}}})$

public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    System.out.printf("請輸入速度 : ");
    double c=3e8;
    double v=in.nextDouble();
    double t=1/Math.pow(1-(v*v)/(c*c), 1/2.0);
    System.out.printf("時間膨脹 :%f 倍\n", t);
}
結果 : 
請輸入速度 : 2.9e8
時間膨脹 :3.905667 倍

請輸入速度 : 28
時間膨脹 :1.000000 倍

也就是說,當一個物体,以極快的速度移動時,此物体的時間會膨脹。它所歷經的一秒,是我們靜止的人的好幾秒。

時間概論

人也只有100年的壽命, 但窮人總是想快點結束生命所以常有自殺事件. 有錢人總是竭盡辦法想活久一點. 那牛呢? 一輩子60年要被摸奶又要耕田, 最後還被煮成牛肉麵. 這一切, 都是人類自以為是的想法.

時間是什麼, 並不好解釋.  若能講解明白, 是可以直接拿諾貝爾獎的, 或者是悟道成仙.

時間, 是一個很抽像的東西, 不存在, 確能感受到(在此暫時說明時間不存在) .科學家亦無法具體的表示出時間是什麼東西. 只能用物體移動時的狀態來表示時間. 比如高鐵行駛200公里花一小時, 台鐵行駛200公里花二小時. 一小時或二小時是用移動的距離來表達.

若以佛學而言, 實有另外解釋. 前世造了多少因, 今世就要還多少果,. 每完成一個果, 就需感覺一定程度的痛苦, 這程度, 以人類的知覺, 就是時間的長短.

這又回到鬼打牆的狀態, 一小時跟二小時又有何差別?? 試想一件事, 廁所裏有沒有人, 跟你有何相關?? 當你屎在滾時, 一秒有如一小時. 當你舒坦時, 管他天荒地老.

廣義相對論中, 時間會被拉伸. 沒唸過物理學的人一看到廣義相對論就覺的好難, 其實不必擔心, 本篇也沒複雜的物理計算式, 只要理解一件平常很常看到的狀況就好~~~當物體移動速度接近光速時, 時間會延緩, 到達光速時就直接凍結. 而在黑洞邊緣, 時間亦有此現象. 所以在地球及黑洞二處之人, 黑洞處的人感覺過了一個小時, 但地球卻經過了好幾年, 甚至好幾萬年.

那時間跟程式又有何關係. 學程式的初期, 的確無法感覺有什麼關係, 要一直到後期才會重視這個問題. 敏感度較高的人, 也許會問~~~在一個迴圈跑了10次, 那跑10次需花費多少時間, 跑一次又需要多少時間? 直白的說, 不懂程式的人, 感覺是~~~咻, 完成了, 完全沒這個問題.

一顆CPU的頻率如果是1G HZ(次), 代表著這顆CPU在一秒之中, 會震盪1G 次, 也就是10億次. G是10億的簡寫, 也就是109.  假設1 HZ可執行一個指令, 那表示CPU可以在1秒中執行10億個指令.
如果1秒執行10億個指令, 那1個指令, 需花多少時間? 當然是1/1,000,000,000 秒

時間單位

下面的說明, 是國際時間單位, 請熟記

1 秒 =

1,000ms(毫秒)
1,000,000µs(微秒)
1,000,000,000ns(奈秒)

所以依上述的問題, 1個指令需花1ns.

光速

光1秒可以走的距離是 3*108公尺 = 30 萬公里, 那一公尺需花多少時間 ?
Ans : 1/(3*10) 秒 = 109/(3*10) ns = 10/3 ns = 3.33ns

那1公分呢, 再除100, 就是0.0333ns

CPU

cpu1  cpu2

一般CPU的大小約為 4*4cm. 電子在裏面跑, 以光速在運動. 假設電子從上跑到下可完成一個指令(當然沒這麼容易啦, 在此只是簡化其他複雜的程序), 那從上跑到下需花費4*0.0333ns=0.1332ns
也就是說一個指令需花費 0.1332ns, 所以1秒可完成 109/0.1332 = 7.5 *10個指令, 也就是7.5GHz

上述的計算, 其實是要說明一件事, CPU再快, 也有一定的極限, 以 4*4cm簡化來說, 最快不會超過7.5GHz. 原因很簡單, 就是光跑的速度不夠快.

當然, 想把CPU的頻率再加快1000倍, 還有一個很簡單的方法, 就是把CPU的大小再縮小1000倍, 變成4/1000 cm = 0.004cm=0.04 mm. 不過目前的技術不可能在這麼小的空間擠進那麼多千萬個電晶體.

ps1. 原子也算蠻大顆的, 平圴約300pm(皮米) = 0.3 nm(奈米), 原子核的大小是電子雲的十萬分之一, 所以這世界是相當虛無空洞的. 為什呢, 請看ps2

ps2. 太陽到地球約1.5億公里, 稱為1AU(1天文單位), 約107顆太陽的大小

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *