Flop
Активный0.0
Установок
Последнее обновление
Версии
Flop | операции с плавающей запятой для Minecraft
Этот датапак представляет собой библиотеку для выполнения операций с плавающей запятой с использованием систем очков. Для этой цели вводится новый формат представления данных — "эроксифлот".
Что такое числа с плавающей запятой?

Число с плавающей запятой — это способ представления вещественных чисел в двоичной системе. Оно состоит из трёх компонентов:
- Знак: определяет, положительное число или отрицательное
- Экспонента: указывает порядок величины числа
- Мантисса: определяет точность представления чисел
Математическое значение такого представления рассчитывается по формуле:
$$(-1)^\text{знак} \times \text{мантисса} \times 2^\text{экспонента}$$
Особенности Эроксифлота
Эроксифлот использует три отдельных системы очков для хранения знака, экспоненты и мантиссы. Библиотека предоставляет функции для преобразования чисел из формата NBT-хранилища в эроксифлоты и обратно. Все математические операции выполняются с таким представлением на основе очков, при этом доступны функции, автоматически выполняющие преобразования — можно просто работать с числами в NBT-хранилище.
Эроксифлот использует 30 бит для мантиссы, что обеспечивает немного более высокую точность по сравнению со стандартным float, но уступает double. Важно отметить, что операции деления и извлечения квадратного корня обеспечивают точность не более 15 бит. Все остальные операции сохраняют полную 30-битную точность.
В отличие от стандартных представлений с плавающей запятой, знак принимает значения -1 и 1, а не 0 и 1.
Как использовать
Перед началом работы необходимо выполнить функцию flop:api/create_scoreboards для настройки необходимых систем очков и значений. Эта функция по умолчанию не входит в тег minecraft:load, её нужно запустить самостоятельно.
На данный момент доступно шесть основных операций:
- Сложение ($a + b$)
- Вычитание ($a - b$)
- Умножение ($a \times b$)
- Деление ($\frac{a}{b}$)
- Возведение в квадрат ($x^2$)
- Извлечение квадратного корня ($\sqrt{x}$)
Самый простой способ использования библиотеки — функции из папки flop:api/storage/. Они выполняют операции непосредственно с числами в NBT-хранилище. Например, для сложения:
data modify storage flop:api operand.a set value 5d
data modify storage flop:api operand.b set value 0.13d
function flop:api/storage/add
data modify <destination> set from storage flop:api output
Операции с одним входным значением (например, sqrt и square) используются следующим образом:
data modify storage flop:api input set value 42.0d
function flop:api/storage/sqrt
data modify <destination> set from storage flop:api output
Продвинутое использование
Для сложных вычислений использование операций с хранилищем может создавать дополнительную нагрузку из-за постоянных преобразований между форматами NBT и эроксифлотов. В таких случаях лучше работать непосредственно с эроксифлотами. Для преобразования числа из NBT-хранилища в эроксифлот используйте функцию flop:api/storage/read_as_eroxifloat. Она преобразует число из storage flop:api input в три значения очков: input.sign flop, input.exponent flop и input.mantissa flop:
data modify storage flop:api input set value 5d
function flop:api/storage/read_as_eroxifloat
scoreboard players operation <destination 1> = input.sign flop
scoreboard players operation <destination 2> = input.exponent flop
scoreboard players operation <destination 3> = input.mantissa flop
Затем можно выполнять те же вычисления, что и ранее, но без дополнительной нагрузки от преобразований в NBT:
scoreboard players operation operand.a.sign flop = <source 1>
scoreboard players operation operand.a.exponent flop = <source 2>
scoreboard players operation operand.a.mantissa flop = <source 3>
scoreboard players operation operand.b.sign flop = <source 4>
scoreboard players operation operand.b.exponent flop = <source 5>
scoreboard players operation operand.b.mantissa flop = <source 6>
function flop:api/eroxifloat/add
scoreboard players operation <destination 1> = output.sign flop
scoreboard players operation <destination 2> = output.exponent flop
scoreboard players operation <destination 3> = output.mantissa flop
scoreboard players operation input.sign flop = <source 1>
scoreboard players operation input.exponent flop = <source 2>
scoreboard players operation input.mantissa flop = <source 3>
function flop:api/eroxifloat/sqrt
scoreboard players operation <destination 1> = output.sign flop
scoreboard players operation <destination 2> = output.exponent flop
scoreboard players operation <destination 3> = output.mantissa flop
Для обратного преобразования в NTP доступны две опции: запись как float или как double. Поскольку эроксифлот обладает немного большей точностью, чем обычный float, рекомендуется использовать второй вариант. Однако в некоторых случаях может потребоваться преобразование именно в формат float:
scoreboard players operation output.sign flop = <source 1>
scoreboard players operation output.exponent flop = <source 2>
scoreboard players operation output.mantissa flop = <source 3>
function flop:api/eroxifloat/write_to_float
scoreboard players operation output.sign flop = <source 1>
scoreboard players operation output.exponent flop = <source 2>
scoreboard players operation output.mantissa flop = <source 3>
function flop:api/eroxifloat/write_to_double