--- title: Scoreboard計算小數 tags: math, number theory --- Minecraft中處理小數運算的方式很不方便,故我們將此獨立成一篇文章來細談, 小數運算泛指「對於所有需要儲存成小數型態資料的變數進行加減乘除法的計算」, 而在下面我們使用了兩種方式來處理小數運算的問題: 一、記分板拆分整數部分與小數部分: 計算(Operation)的方式即使用scoreboard自帶的operations 二、利用屬性(Attributes)儲存小數: 計算(Operation)的方式是利用修改修飾符(Modifiers)的方式來實現 --- # Scoreboard計算小數 對於每筆數值,都需要將其儲存成兩份資料, 儲存資料的方式可以開三個記分板:Integer, Fraction, Exponent 分別儲存一個小數的整數部分(Integer part)、小數部分(Fractional part)和指數部分(Exponent Part) (以下會簡化其變數名稱為 `int, frac, exp`) 例如`15.75`,我們會將其存成數組 `(int, frac, exp)=(15, 75, -2)` 但若exp的值比-9還小時,即有可能會出現溢位問題,若 如果要處理此類型的計算則需要用到 [大數運算]() 的方式來處理 (在此篇我們都不會考慮需要大數運算的狀況) ![](https://raw.githubusercontent.com/xuese0513/images/ca58c369f60cce3a452030639d3c1bfc6fcc7990/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/decimal.svg) --- ## 定義小數四則運算 ( decimal format : $n=\color{blue}i+\color{red}f\cdot\color{orange}{10^e}$ ) ![](https://raw.githubusercontent.com/xuese0513/images/ca58c369f60cce3a452030639d3c1bfc6fcc7990/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/base.svg) --- * ### 加法運算(Addition Operation) ![](https://raw.githubusercontent.com/xuese0513/images/0ede7ee19917062995585a6dd71f61bb99516e00/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/decimal%20a%2Bb.svg) --- * ### 減法運算(Addition Operation) 請注意,這裡的小數部分,也就是frac的值通常都會紀錄為正的, 若是小數值取負數,那麼可以用這樣的方式變換: ![](https://raw.githubusercontent.com/xuese0513/images/cc301d092ec29c651e85cd5473b430b3b26aed80/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/decimal%20a%2B(-b).svg) --- * ### 乘法運算(Multiplication Operation) ![](https://raw.githubusercontent.com/xuese0513/images/5eeda10c7e4bc365548187fdd14caaebee6d3a15/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/decimal%20ab.svg) --- * ### 除法運算(Division Operation) 以代數變換的方式沒辦法直接計算小數的除法運算, 對於除法運算的方式將於後續 [牛頓法—計算小數除法]() 中詳述 --- ## 將計分板數組轉換為小數資料 首先要注意的是,execute指令轉型態是會去位的,故我們要處理此類型的型態轉換應當用data處理會比較合適 主要處理的部分是儲存小數的部分,在此我們可以使用直接判斷exp的數值,並直接指派要用倍率轉換即可(以下我們用二進位的方式來加速轉換) ``` execute store entity @s Pos[0] 1 double run scoreboard players get exp decimal execute if score exp decimal matches ..-8 ``` 缺點是在於需要自行設計小數運算的方式,在大多情況下通常並不會想要真的手刻一股小數運算出來,而是更傾向用原版自帶的小數計算系統,這就不得不提Attributes這個東西了