---
# System prepended metadata

title: Attribute計算小數
tags: [math, ' number theory']

---

---
title: Attribute計算小數
tags: math, number theory
---

# Attribute計算小數
Minecraft僅有提供記分板計算，但其只能處理整數資料，還必須要進行型態轉換，
對於大部分需要小數計算的數據而言很不方便

我們的目的是在於可以將「小數變數」直接進行計算，而不需要轉換成記分板的形式
而在Minecraft中其實已經有提供一個小數運算的機制，也就是Attributes
利用修改attributes的修飾符(Modifiers)可以進而實現加減乘法的效果

---

## 屬性修飾符(Attribute Modifiers)
一共有4個參數
* Name : 名稱，不是特別重要
* Amount : 此修飾符的值
* UUID[4] : 帶四個整數(int)的陣列，在同一個修飾符組中不得有重複者
* Operation ： 以Amount進行指定的屬性操作方式，一共有3種操作選項：
    * 0 : add
    * 1 : multiply_base
    * 2 : multiply

其結算方式可以直接參考此式子：
$(\text{Base}+\Sigma A)\cdot(1+\Sigma N)\cdot\Pi(1+M_i)$

$\Sigma A$ : 所有修飾符中Operation為add者的Amount總和
$\Sigma N$ : 所有修飾符中Operation為multiply_base者的Amount總和
$\Pi(1+M_i)$ : 所有修飾符中Operation為multiply者，將各者Amount加1之後再乘起來的總值

---

## 問題
首先我們會遇到兩個問題：
1. 計算乘積時會需要處理式子中額外+1的問題
2. 沒有辦法「修改」已存在的修飾符之Amount值

針對第一點其實並不難，我們可以將其變成一個「二元運算」的方式就好，計算時再額外放入一個{Operation:1, Amount:-1}的東東來去除+1的部分

第二點的問題如果想測試的可以自行測試看看：
`data modify entity ... Attributes [0].Modifiers[0].Amount set value 77.0`
執行完後查詢同樣路徑，會發現值沒有更改
`data get entity ... Attributes [0].Modifiers[0].Amount`

比較難處理的是第二點，如果改不了屬性值不就等於沒救了？不等等，還有一個替代方案可以處理這個問題

### 解法

這條指令是可以成功修改修飾符的：
`data modify entity ... Attributes[0].Modifiers set value {Name:"add", Amount:1.0d, Operation:0, UUID:[I;0,0,0,0]}`

與其說是修改，倒不如說是新放入一個新的修飾符，因為舊的Modifiers資料都不會消失
只有set和merge的操作是有效的，其他像是append, prepend, insert全部都沒效

故我們要做的是就是先建構好Modifiers的部分，
可以利用storage開一個陣列來建，過程並不會特別複雜

---

## 加減乘的運算

基本上「加減乘法」皆適用這樣的流程方式來計算：
1. 建構Modifiers列表
2. 生成實體，初始化屬性Base值為0，並將建好的Modifiers放到該屬性中

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

$\text{Base} = 0$
$\Sigma A = a+b$

$\text{result} = (0+a+b)$

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

$\text{Base} = 0$
$\Sigma A = a-b$

$\text{result} = (0+a-b)$

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

$\text{Base} = 0$
$\Sigma A = a$ (這裡也可以改成修改Base)
$\Sigma N=b-1$

$\text{result} = (0+a)\cdot(1+b-1)$


> 建議嘗試推廣出連乘 $(a\times b\times c\times d)$ 或連加 $(a+b+c+d)$ 的方式
---