Скачать Flop — Minecraft Моды — MetaMods
Flop

Установок

0

Последнее обновление

2 года назад

Версии

1.15 — 1.20.2
Сервер
Библиотеки

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
Участники проекта
Eroxen

Eroxen

Разработчик

Создан: 27 сен 2023

ID: 24815