---
# System prepended metadata

title: 複合方式計算小數
tags: [math, ' number theory']

---

---
title: 複合方式計算小數
tags: math, number theory
---

# 分離式儲存小數

為了處理Attribute只能計算 `[-1024.0, 1024.0]` 的值域限制問題，
我們可以把一個小數拆分成整數(int)與小數(frac)的部分，
相比於Scoreboard的作法，不需要去考慮小數的指數部分，
可以將其拆成如下的方式來看：
![](https://raw.githubusercontent.com/xuese0513/images/267eda4be08b826b9a882bb99bed520cfe5f7568/article/%E5%B0%8F%E6%95%B8%E9%81%8B%E7%AE%97/float%20sperate.svg)
> 1. <font color=red>frac-part</font> 也可以儲存≥1.0的值
> 2. <font color=blue>int-part</font> 同樣也存成 double 的好處有很多
    > (1) 套入attribute時不需要再考量轉換精準度的問題
    > (2) 可以直接把int-part轉換入scoreboard進行計算
    > (3) 可以把int-part和frac-part存入同一個陣列中，或是存成一個2維向量

---

## 要如何將其分離成整數與小數兩部分？

我們可以將數值放到 Pos 中去處理，可看成是處理座標上的值轉換問題，


---

## 分離之後要怎麼進行計算？
概念其實很簡單，同樣都是塞到Attribute的公式去計算結果就行了
$\text{result} = (\text{Base}+\Sigma A)\cdot(1+\Sigma N)\cdot\Pi(1+M_i)$


* ### 加法運算(Addition Operation)

$\text{Base} = 0$
$\Sigma A =A_\text{int}+A_\text{frac}+B_\text{int}+B_\text{frac}$

$\text{result} = (0+A_\text{int}+A_\text{frac}+B_\text{int}+B_\text{frac})$

* ### 減法運算(Addition Operation)

$\text{Base} = 0$
$\Sigma A =A_\text{int}+A_\text{frac}-B_\text{int}-B_\text{frac}$

$\text{result} = (0+A_\text{int}+A_\text{frac}-B_\text{int}-B_\text{frac})$

* ### 乘法運算(Multiplication Operation)

$\text{Base} = 0$
$\Sigma A = A_\text{int}+A_\text{frac}$
$\Sigma N=B_\text{int}+B_\text{frac}-1$

$\text{result} = (0+A_\text{int}+A_\text{frac})\cdot(1+B_\text{int}+B_\text{frac}-1)$

但我個人很推薦將其改成使用二維向量的方式來儲存和計算，
在設計上就可以省去很多需要額外考量的點，也會比較方便處理

---

## 使用這種方式的優缺點

### pros
相比於只使用Attribute來計算，可以得到更大的數值空間，同時兼具一定程度的小數精準度

### cons