lawref.units
Алгебра размерностей §49.1–§49.2 (errata E-0136, DECISION-0154).
Значение Magnitude — точный рациональный коэффициент и канонический
мультимножитель ПРОСТЫХ единиц. Размерность и масштаб здесь ВЫЧИСЛЯЮТСЯ по
реестру объявлений, а не хранятся в значении: второй источник истины разошёлся
бы с реестром молча (§49.1).
Канон идентичности — чистая функция мультимножителя и НИКОГДА не разбирается
обратно: имя базовой единицы само может содержать подчёркивание
(ft_per_half_min), и грамматика «база _per_ база» неоднозначна. Отсюда же
следует, что литерал Magnitude не входная поверхность — переход делает терм
magnitude(q).
Реализация опирается ТОЛЬКО на int и Fraction: Decimal зависит от
контекста, а коэффициент величины обязан быть точным при любой разрядности
(полномочие владельца: BigInt только для новых операций).
Attributes
| Name | Description |
|---|---|
BASE_DIMENSIONS | No description. |
DIMENSIONLESS | No description. |
Classes
Functions
| Name | Description |
|---|---|
canon | Идентичность составной единицы §49.1 — ЧИСТАЯ функция мультимножителя. |
combine | Произведение либо частное величин (§58.1): показатели складываются |
convert | Явная конверсия внутри размерности (§259.1). |
dimension | Вектор показателей по семи базовым SI (§49.1). |
expand | Имя единицы → мультимножитель ПРОСТЫХ единиц (§49.2). |
exponent | Показатель ПРОСТОЙ единицы name в мультимножителе величины (§259.1, |
factors_text | Мультимножитель для сообщения об отказе: ft2^1, ft^2·s^-1 (E-0151). |
mag | Конструктор канона: нулевые показатели сняты, имена по возрастанию байтов. |
project | Величина алгебры → коэффициент в ЗАЯВЛЕННОЙ единице (§259.1). |
promote | Quantity[tag] → Magnitude (§259.1): тег разрешается в реестре. |
same_unit | Тождество идентичности единицы (§58.1): сложение, вычитание и сравнение. |
scalar | Величина НУЛЕВОЙ размерности → точный Rational (§259.1). |
scale | Точный масштаб мультимножителя к произведению базовых единиц (§49.1). |
unit_table | Индекс unit_decl по ИМЕНИ единицы (§49.2). |
BASE_DIMENSIONSattributemodule attribute#
BASE_DIMENSIONS = ('Length', 'Mass', 'Time', 'Current', 'Temperature', 'Amount', 'Luminosity')DIMENSIONLESSattributemodule attribute#
DIMENSIONLESS = (0) * len(BASE_DIMENSIONS)Magclassdataclass#
class Mag(coeff: Fraction, factors: tuple[tuple[str, int], ...])Значение Magnitude: коэффициент и мультимножитель простых единиц.
factors — кортеж пар (имя простой единицы, ненулевой показатель),
отсортированный по имени: канон держится КОНСТРУКТОРОМ mag, а не
договорённостью вызывающих.
UnitErrorclass#
class UnitError(code: str, message: str)Bases: Exception
Отказ алгебры размерностей; code — машинный код issue (§49.1).
canonfunction#
def canon(factors: tuple[tuple[str, int], ...]) -> strИдентичность составной единицы §49.1 — ЧИСТАЯ функция мультимножителя.
Показатель в записи — модуль; знак решает половину. Пустой числитель
печатается 1: безразмерная величина остаётся величиной, а не числом
(число извлекает scalar_of).
combinefunction#
def combine(left: Mag, right: Mag, divide: bool) -> MagПроизведение либо частное величин (§58.1): показатели складываются (вычитаются), нулевые снимаются, коэффициенты считаются точно.
convertfunction#
def convert(table: dict[str, dict[str, Any]], value: Mag, target: str) -> MagЯвная конверсия внутри размерности (§259.1).
dimensionfunction#
def dimension(table: dict[str, dict[str, Any]], factors: tuple[tuple[str, int], ...]) -> tuple[int, ...]Вектор показателей по семи базовым SI (§49.1).
Размерность ПРОСТОЙ единицы — сама произведение базовых: у литра это
Length^3. Без произведения децилитр был бы невыразим вовсе — масштаб
1/10 от литра не сводится к целой степени простой длины, а множителя у
производной единицы нет по построению (иначе литр и децилитр получили бы
ОДИН мультимножитель и один канон, то есть перестали бы различаться).
expandfunction#
def expand(table: dict[str, dict[str, Any]], name: str, seen: tuple[str, ...] = ()) -> dict[str, int]Имя единицы → мультимножитель ПРОСТЫХ единиц (§49.2).
Алиас разворачивается в цель, производная — в свои множители, простая — в саму себя. Цикл ловится путём, а не глубиной: сообщение обязано назвать цепочку, иначе автор ищет её вручную.
exponentfunction#
def exponent(table: dict[str, dict[str, Any]], value: Mag, name: str) -> intfactors_textfunction#
def factors_text(factors: tuple[tuple[str, int], ...]) -> strМультимножитель для сообщения об отказе: ft2^1, ft^2·s^-1 (E-0151).
Печатается показатель каждого множителя, включая 1, — иначе запись
снова совпала бы с каноном и ничего не различала.
magfunction#
def mag(coeff: Fraction, factors: dict[str, int] | tuple[tuple[str, int], ...]) -> MagКонструктор канона: нулевые показатели сняты, имена по возрастанию байтов.
projectfunction#
def project(table: dict[str, dict[str, Any]], value: Mag, target: str) -> FractionВеличина алгебры → коэффициент в ЗАЯВЛЕННОЙ единице (§259.1).
Обратный ход алгебры, и он ПРОВЕРЯЕМЫЙ, а не перетегировка: мультимножитель
величины обязан СОВПАСТЬ с раскрытием названной единицы. 6 N · 50 m даёт
{kg:1, m:2, s:-2}, и J раскрывается в тот же набор — заявление принято;
напиши автор m, и набор {m:1} не совпадёт, а таран №4 (работа с тегом
ДЛИНЫ при статусе TRUE_ONLY) станет громким отказом.
Приведения масштабов здесь НЕТ намеренно: km и m — разные наборы, и
перевод остаётся у unit_convert. Иначе проекция молча меняла бы число.
promotefunction#
def promote(table: dict[str, dict[str, Any]], tag: str, value: Fraction) -> MagQuantity[tag] → Magnitude (§259.1): тег разрешается в реестре.
Непрозрачные теги права (mrp, business_day, «щелчок») не разрешаются и
в алгебру не переходят — это рамка 2 DECISION-0068, а не недоделка.
same_unitfunction#
def same_unit(op: str, left: Mag, right: Mag) -> NoneТождество идентичности единицы (§58.1): сложение, вычитание и сравнение.
Тождество — по МУЛЬТИМНОЖИТЕЛЮ, а не по строке канона (errata E-0151): строка сравнивается первой только ради прежней формулировки отказа.
Отказ называет РОД: разные масштабы ОДНОЙ размерности сюда попадают тем же
путём, что разные размерности, и до errata обе половины отвечали одним
DIMENSION_MISMATCH — диагностика врала (замер фазы 0, §3 п. 2
DECISION-0154). Здесь код один, но сообщение называет обе единицы, а
различение размерности живёт у unit_convert/scalar_of.
scalarfunction#
def scalar(table: dict[str, dict[str, Any]], value: Mag) -> FractionВеличина НУЛЕВОЙ размерности → точный Rational (§259.1).
scalefunction#
def scale(table: dict[str, dict[str, Any]], factors: tuple[tuple[str, int], ...]) -> FractionТочный масштаб мультимножителя к произведению базовых единиц (§49.1).
unit_tablefunction#
def unit_table(nodes: list[dict[str, Any]] | None) -> dict[str, dict[str, Any]]Индекс unit_decl по ИМЕНИ единицы (§49.2).
Имя, объявленное дважды РАЗНЫМ содержимым, из индекса выбывает: разрешить его пришлось бы порядком узлов, то есть молча выбрать одно из двух объявлений. Дубликат байт в байт (одна декларация, доехавшая двумя путями импорта) схлопывается.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.