contributed by < Veternal1226
>
sysprog2020
1
bfloat16 浮點數格式由 Google 公司發展,最初用於該公司第三代 Tensor 處理單元 (Cloud TPU)。bfloat16 的主要想法是提供 16 位元浮點數格式,其動態範圍與標準 IEEE 754 的 FP32 (Single-precision floating-point format) 相同,但精度較低,相當於指數區和 FP32 保持相同的 8 位元,並將 FP32 的 fraction 區域縮減到 7 位元。
BFloat16 的範例
下列是個轉換程式:
對應的測試程式:
參考執行結果:
請補完程式碼。
作答區
BB1 = (c) 0xff800000
BB2 = (e) 0xffff0000
參考資料:
*pr &= BB1;
作用:取出sign+exp 所以BB1
選 (c) 0xff800000
目標:把23位元砍到變7位元,且不能動到sign&exp
因為bitwise是對整數,所以要強制轉型(int *pr = (int *) &r;
)
fraction 長度從 23 變成 7 是右位移 16bits,所以除以256(r /= 256;
)
把剛剛保留的 sign & exp 與縮短完的數結合,把最低的16bit去掉,即完成 float32 to bfloat16 轉換,因此BB2
選 (e) 0xffff0000
延伸問題:
//TODO
2
考慮以下 ring buffer 的實作:
其測試程式如下:
請補完程式碼,使得測試程式得以正確執行。
作答區
RB1 = (a) 1
RB2 = (a) 1
第 17 & 18 行的 macro 作用為回傳下一個可使用的 start 位置,若buffer內有元素則回傳(BUF)->start+1 (表下一個),若 該位置還沒有元素則回傳 0。
因此 RB1 = (a) 1
第 19 行也是相同機制,macro 作用為回傳下一個可使用的 end 位置,若能使用則回傳(BUF)->end+1 (表下一個),若 buffer 已滿則回傳 0。
因此 RB2 = (a) 1
延伸問題:
確認詳閱 C 語言前置處理器應用篇 和 C 語言程式設計技巧
//TODO
3
考慮到以下靜態初始化的 singly-linked list 實作:
其執行結果為:
這裡的 9547 不是周星馳電影裡面的密碼,而是指小行星 9547
請補完程式碼,使程式碼和執行結果相匹配。
作答區
A = (d) 7
B = (c) 4
C = (b) 5
D = (a) 9
SS1 = (d) node->next = *head
SS2 = (b) *head = node
第39行宣告完後,list如下圖所示:
因此[D,C,B,A]應依序填入[9,5,4,7]。
A = (d) 7
B = (c) 4
C = (b) 5
D = (a) 9
第12~24行的函式目的是將新node插入list中正確的位置而不破壞由小到大的排序,14~18是在做例外處理,用來處理*head
指向NULL
的情況、與新增的數值(val)小於list中最小節點的值時如何處理,也就是將新node插在list的前面,圖解如下:
*head
assign 給新節點的 next,翻成程式碼即為 node->next = *head
,node->next = *head
*head
指到此新node,翻成程式碼即為 *head = node
,*head = node
延伸問題:
//TODO
4
LeetCode 287. Find the Duplicate Number 給定一個整數序列,其中會有一個數值重複,請找出。
已知條件:
考慮以下程式碼是可能的解法:
CCC = (b) c1 < c2
以數列[5,2,5]舉例
k | num[k] | bit=0001(c1,c2) | 0010 | 0100 | 1000 |
---|---|---|---|---|---|
0000 | 0101 | 0,1 | 0,0 | 0,1 | 0,0 |
0001 | 0010 | 1,1 | 0,1 | 0,1 | 0,0 |
0010 | 0101 | 1,2 | 1,1 | 0,2 | 0,0 |
預期結果 | 1 | 0 | 1 | 0 |
因此推測可能的判斷式為 (b) c1 < c2
延伸問題:
//TODO