• 沒有找到結果。

P ROTOCOL FOR F LOAT (D OUBLE ) C LASS

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

31

4.4 Protocol for Float (Double) Class

目前處理浮點數的加減乘除運算,目標是模仿 IEEE 754,以達到可表示 IEEE 754 所定 義的浮點數表達範圍。目前先以單精度浮點數為目標,建構出 Float 型態的浮點數。

圖 3: Float 型態的記憶體儲存方式。

浮點數的資料形態是由三個部分所組成的,分別是 sign、exponent、mantissa,且三 者的值域分別為 Z2、Z2^8、Z2^23,但是為了往後設計演算法上的方便,決定在資料結構 內部,改以 Z2^26來定義 mantissa 的值域,這是為了使得當初 IEEE 754 表示法所省略的 整數位數 1 也給放進來,使得第 24bit 不為 0,且當 mantissa 執行加法的運算時,可能 會造成進位的情形,所以多保留了第 25bit 來儲存進位的 1,以此為緩衝,而當 mantissa 執行減法的運算時,不但可能造成進位的情形,還有可能出現負數的狀況,所以又多增

Algorithm: division

u = z2_to_zn(zn_to_z2(x)) v = z2_to_zn(zn_to_z2(y)) q = []

31.downto(0) do |i|

t = (u - v * 2**i) % d s = negative?(t)

q[i] = case(@client_type) when 1 then (1+s) %2 when 2 then s end

u = if_then_else(s, u, t) end

[z2_to_zn(q), (u % d)]

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

32

加了第 26bit,以此為 MSB 來判斷 mantissa 的正負號,之後再做 sign 與 exponent 的調整。

IEEE 754 裡定義的浮點數表示法,其所能表達的數值範圍是有其限制的,根據不同精 度的浮點數表示法,可表示的數值範圍也不同,這裡將以單精度浮點數 Float 型態做為 多方安全計算裡浮點數運算設計的參考。Float 可表示的有效範圍以二進位表示為±

(2-2-23) × 2127,十進位表示法約為 ± 1038.53 左右。而在可表示範圍外的數則可分為五類,

分別為以下幾種情形:

1. Negative numbers less than -(2-2-23) × 2127 (negative overflow) 2. Negative numbers greater than -2-149 (negative underflow) 3. Zero

4. Positive numbers less than 2-149 (positive underflow)

5. Positive numbers greater than (2-2-23) × 2127 (positive overflow)

IEEE 754 將此種極值定義為 Infinity 或 NaN,亦即是遇到 E 為 0 或者是 255 的情形,

若是此數值為 Infinity 的運算,則有可能的輸出為 Infinity 或 NaN,分別表示極值跟不存 在。而 Zero 則是另外定義其值,亦即將 S、E、M 的值皆設為 0,以此來表示零。

而在 secure multi-party computation 的計算中,皆是以分持的數值型態來做運算,當 遇到此種極值的狀態時,由於分持數是以環的概念來表示的,所以當運算中有 overflow 或 underflow 的情形發生時,經過模(Mod)運算之後,依然會處在 Domain 可表示的範圍。

所以說經過 secure multi-party computation 之後所得的值,在例外情形出現後有可能得 到非預期的結果,亦即計算完得到不正確的答案,並且不提出例外情形的警告,以避免 被有心人士依此來猜測其運算所輸入的數值內容,所以使用者在使用浮點數運算來設計 script 時就必須自己把握好計算時可能產生的例外情形。

在設計浮點數的四則運算時,會需要用到之前所定義好的 building blocks,例如整數

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

33

的四則運算,利用現有的基礎運算單元,來組合出更複雜的 building block。

首先假設浮點數的型態為 S×M×baseE,則我們定義一個浮點數的物件型態為 F,其中 包含了三個 secret 型態的數值資料,分別為 S、M、E 的分持型態的數值,S 表示 sign、

E 表示 exponent、M 表示 mantissa,則浮點數 F 的值為 S×M×baseE運算所得的結果。現 在我們可以來定義出 F1 = S1 × M1 × 2E1、F2 = S2 × M2 × 2E2,想求得 F1+F2、F1-F2、F1 × F2、 F1 ÷ F2的四則運算結果。

4.4.1 Float Plus & Float Minus

浮點數的加減法運算,可視為同一個要解決的問題,因為透過 sign bit 可決定數值的 正負,可利用相同的演算流程解出答案來,其中還必須要解決數值型態的轉換問題以及 小數點對齊的處理,都要解決分持形態所帶來的計算上的困難。

演算流程如下所示:

Specification: float plus & float minus

F1 ± F2 = S × M × 2E

1. According the E to alignment mantissa M1 and M2.

2. Adding sign to change the mantissa’s sign.

3. M = M1 ± M2

4. Checking the result M’s sign and changing the M’s sign as new sign S.

5. According the sign S to alignment the new mantissa by 1 bit.

6. Select exponent E1 or E2 as E, and according the sign S to modify the new exponent by 1 bit.

7. Return (S, E, M)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

34

4.4.2 Float Product

浮點數的乘法運算則較為單純一些,因為小數部分不需做對齊的動作,所以可以直 接做相乘的動作,且指數部分做相對應的加減法就可得到新的浮點數答案。其中不可避 免的,也是會遇到數值型態的轉換。演算流程如下所示:

Specification: float product

F1 × F2 = S × M × 2E

1 Check the sign of new result.

2 Compute the new exponent E.

3 Change M’s domain from Z(2^26) -> Z(2^52). 4 M = M1 × M2

5 According the MSB of M to alignment the mantissa M.

6 Return (S, E, M).

Algorithm: float plus & float minus

F1 ± F2 = S × M × 2E 1. e = E1 – E2 = E1 + (–E2)

1.1 m1 = Shift-right(((S1 == 0) ? M1 : -M1), △e) If (△e < 0) 1.2 m2 = Shift-right(((S2 == 0) ? M2 : -M2), △e) If (△e > 0) 2. m1 , m2 = s × m1 , s × m2

3. M = m1 ± m2

4. S = (M < 0) ? 1 : 0

5. M = (M < 0) ? Shift-Right(M, 1) : M 6. E = (M < 0) ? E+1 : E

7. Return (S, M, E)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

35

4.4.3 Float Division

浮點數的除法運算有些類似乘法運算,差別在小數部分的地方要改為分持數值的除 法運算。而這個地方又會遇到當初整數值做除法所遇到的問題,而要處理未能整除的部 分,則是改利用將被除數放大的辦法,將被除數往左 shift,使得當做完除法時,小數位 數的部分可變成整數除法的商,如要用偵測是否除盡的方式來檢查,這將會造成不可接 受的計算成本,所以直接使用整數除法的概念來處理即可。而由於做了被除數往左移的 動作,所以會造成有一半的除法所做的運算結果均為零,所以可以省略掉,只需做一半 的除法運算,其餘剩下的就是處理浮點數的 S、E、M 的調整。

演算流程如下所示:

Specification: float division

F1 ÷ F2 = S × M × 2E

1 M1, M2 change domain from Z(2^26) -> Z(2^52), and M1 shift left 24 bits.

2 Division: q = M1 / M2

3 According the MSB of q to alignment mantissa by 1 bit.

4 Check the sign of new result.

5 Compute the new exponent E.

6 Return (S, E, M).

Algorithm: float product

1 S = (S1 + S2) mod 2 2 E = (E1 + E2) mod 28 3 M = (M1 × M2) mod 248 4 M = M.to_a

5 M = (MSB of M is 0) ? (M[1, 24].to_i) : (M[0,24].to_i) 6 Return (S, M, E)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

36

相關文件