IEEE 754

редактировать

Стандарт IEEE для арифметики с плавающей точкой ( IEEE 754 с) представляет собой технический стандарт для арифметики с плавающей точкой, установленной в 1985 году Институтом инженеров электротехники и электроники (IEEE). Стандарт решает многие проблемы, обнаруженные в различных реализациях с плавающей запятой, которые затрудняют их надежное и портативное использование. Многие аппаратные устройства с плавающей запятой используют стандарт IEEE 754.

Стандарт определяет:

  • арифметические форматы: наборы двоичных и десятичных данных с плавающей запятой, которые состоят из конечных чисел (включая нули со знаком и субнормальные числа ), бесконечности и специальных «не числовых » значений ( NaN ).
  • форматы обмена: кодировки (битовые строки), которые могут использоваться для обмена данными с плавающей запятой в эффективной и компактной форме
  • правила округления: свойства, которые должны выполняться при округлении чисел во время арифметических операций и преобразований
  • операции: арифметические и другие операции (например, тригонометрические функции ) над арифметическими форматами
  • обработка исключений: указание на исключительные условия (например, деление на ноль, переполнение и т. д.)

IEEE 754-2008, опубликованный в августе 2008 г., включает почти весь исходный стандарт IEEE 754-1985, а также стандарт IEEE 854-1987 для не зависящей от основания арифметики с плавающей запятой. Текущая версия IEEE 754-2019 была опубликована в июле 2019 года. Это небольшая редакция предыдущей версии, включающая в основном уточнения, исправления дефектов и новые рекомендуемые операции.

СОДЕРЖАНИЕ

  • 1 Разработка стандарта
  • 2 формата
    • 2.1 Представление и кодирование в памяти
    • 2.2 Основные и обменные форматы
    • 2.3 Расширенные и расширяемые форматы точности
    • 2.4 Форматы обмена
      • 2.4.1 Двоичный
      • 2.4.2 Десятичный
  • 3 Правила округления
    • 3.1 Округление до ближайшего
    • 3.2 Направленное округление
  • 4 Необходимые операции
    • 4.1 Предикаты сравнения
    • 4.2 Предикат тотального упорядочивания
  • 5 Обработка исключений
  • 6 Рекомендации
    • 6.1 Альтернативная обработка исключений
    • 6.2 Рекомендуемые операции
    • 6.3 Оценка выражения
    • 6.4 Воспроизводимость
  • 7 Представление символов
  • 8 См. Также
  • 9 Примечания
  • 10 Ссылки
    • 10.1 Стандарты
    • 10.2 Вторичные ссылки
  • 11 Дальнейшее чтение
  • 12 Внешние ссылки

Стандартная разработка

Первый стандарт арифметики с плавающей запятой, IEEE 754-1985, был опубликован в 1985 году. Он охватывал только двоичную арифметику с плавающей запятой.

Новая версия IEEE 754-2008 была опубликована в августе 2008 года после семилетнего процесса пересмотра под председательством Дэна Зураса и редактором Майка Коулишоу. Он заменил как IEEE 754-1985 (двоичная арифметика с плавающей запятой), так и стандарт IEEE 854-1987 для Radix-независимой арифметики с плавающей запятой. Двоичные форматы исходного стандарта включены в этот новый стандарт вместе с тремя новыми базовыми форматами, одним двоичным и двумя десятичными. Чтобы соответствовать текущему стандарту, реализация должна реализовывать по крайней мере один из основных форматов как арифметический формат, так и формат обмена.

Международный стандарт ISO / IEC / IEEE 60559: 2011 (с содержанием, идентичным IEEE 754-2008) был одобрен для принятия через JTC1 / SC 25 в соответствии с соглашением ISO / IEEE PSDO и опубликован.

Текущая версия IEEE 754-2019, опубликованная в июле 2019 года, является производной и заменяет IEEE 754-2008 после процесса пересмотра, начатого в сентябре 2015 года под председательством Дэвида Г. Хоу и отредактированным Майком Коулишоу. Он включает в себя в основном пояснения (например, totalOrder) и исправления дефектов (например, minNum), но также включает некоторые новые рекомендуемые операции (например, augmentedAddition).

Международный стандарт ISO / IEC 60559: 2020 (с содержанием, идентичным IEEE 754-2019) был одобрен для принятия через JTC1 / SC 25 и опубликован.

Форматы

Формат IEEE 754 - это «набор представлений числовых значений и символов». Формат также может включать в себя то, как кодируется набор.

Формат с плавающей запятой определяется следующим образом:

  • основание (также называемое основанием системы счисления) b, которое в IEEE 754 равно 2 (двоичное) или 10 (десятичное);
  • точность p ;
  • диапазон экспоненты от emin до emax, где emin = 1 - emax для всех форматов IEEE 754.

Формат включает:

  • Конечные числа, которые можно описать тремя целыми числами: s  = знак (ноль или один), c  = значащая величина (или коэффициент), имеющая не более p цифр при записи в базе b (т. Е. Целое число в диапазоне от 0 до 0). to b p  - 1), и q  = показатель такой, что emin ≤ q  +  p  - 1 ≤ emax. Числовое значение такого конечного числа равно (−1) s × c × b q. Кроме того, есть два нулевых значения, называемых нулями со знаком: бит знака указывает, равен ли ноль +0 (положительный ноль) или -0 (отрицательный ноль).
  • Две бесконечности: + ∞ и −∞.
  • Два вида NaN (не числа): тихий NaN (qNaN) и сигнальный NaN (sNaN).

Например, если b = 10, p = 7 и emax = 96, то emin = −95, мантисса удовлетворяет 0 ≤ c ≤9 999 999, а показатель степени удовлетворяет условию −101 ≤ q ≤ 90. Следовательно, наименьшее ненулевое положительное число, которое может быть представлено, равно 1 × 10 −101, а наибольшее - 9999999 × 10 90 (9,999999 × 10 96), поэтому полный диапазон чисел составляет от -9,999999 × 10 96 до 9,999999 × 10 96. Числа - b 1− emax и b 1− emax (здесь −1 × 10 −95 и 1 × 10 −95) являются наименьшими (по величине) нормальными числами ; ненулевые числа между этими наименьшими числами называются субнормальными числами.

Представление и кодирование в памяти

Некоторые числа могут иметь несколько возможных представлений в экспоненциальном формате. Например, если b  = 10 и p  = 7, то −12,345 может быть представлено как −12345 × 10 −3, −123450 × 10 −4 и −1234500 × 10 −5. Однако для большинства операций, таких как арифметические операции, результат (значение) не зависит от представления входных данных.

Для десятичных форматов допустимо любое представление, и набор этих представлений называется когортой. Если результат может иметь несколько представлений, стандарт определяет, какой член когорты выбран.

Для двоичных форматов представление становится уникальным путем выбора наименьшего представимого показателя степени, позволяющего точно представить значение. Кроме того, показатель степени не представлен напрямую, но добавляется смещение, так что наименьший представимый показатель степени представлен как 1, а 0 используется для субнормальных чисел. Для чисел с показателем в нормальном диапазоне (поле показателя не содержит ни всех единиц, ни всех нулей), ведущий бит мантиссы всегда будет равен 1. Следовательно, ведущая единица может подразумеваться, а не присутствовать явно в кодировке памяти, и по стандарту явно представленная часть мантиссы будет находиться между 0 и 1. Это правило называется соглашением о начальных битах, неявным соглашением о битах или соглашением о скрытых битах. Это правило позволяет двоичному формату иметь дополнительную точность. Соглашение о начальных битах не может использоваться для субнормальных чисел, поскольку они имеют показатель степени за пределами диапазона нормального показателя и масштабируются наименьшим представленным показателем, используемым для наименьших нормальных чисел.

Из-за возможности множественных кодировок (по крайней мере, в форматах, называемых форматами обмена) NaN может нести другую информацию: знаковый бит (который не имеет значения, но может использоваться некоторыми операциями) и полезную нагрузку, которая предназначена для диагностики. информация, указывающая на источник NaN (но полезная нагрузка может иметь другое использование, например, NaN-бокс).

Базовые и обменные форматы

Стандарт определяет пять основных форматов, названных по их числовой базе и количеству битов, используемых при их обменном кодировании. Существует три основных двоичных формата с плавающей запятой (с 32-, 64- или 128-битной кодировкой) и два основных десятичных формата с плавающей запятой (с 64- или 128-битной кодировкой). В binary32 и binary64 форматах являются одиночными и двойными форматами IEEE 754-1985 соответственно. Соответствующая реализация должна полностью реализовывать хотя бы один из основных форматов.

Стандарт также определяет форматы обмена, которые обобщают эти основные форматы. Для двоичных форматов требуется соглашение о начальных битах. В следующей таблице приведены самые маленькие форматы обмена (включая основные).

Имя Распространенное имя База Значащие биты или цифры Десятичные цифры Биты экспоненты Десятичный E макс. Экспонентное смещение E мин E макс Примечания
двоичный16 Половинная точность 2 11 3,31 5 4,51 2 4 -1 = 15 −14 +15 не базовый
двоичный32 Одинарная точность 2 24 7,22 8 38,23 2 7 -1 = 127 −126 +127
двоичный64 Двойная точность 2 53 15,95 11 307,95 2 10 -1 = 1023 −1022 +1023
двоичный128 Четверная точность 2 113 34,02 15 4931,77 2 14 -1 = 16383 −16382 +16383
двоичный256 Восьмеричная точность 2 237 71,34 19 78913,2 2 18 -1 = 262143 −262142 +262143 не базовый
десятичный32 10 7 7 7,58 96 101 −95 +96 не базовый
десятичный64 10 16 16 9,58 384 398 −383 +384
десятичный128 10 34 34 13,58 6144 6176 −6143 +6144

Обратите внимание, что в приведенной выше таблице минимальные показатели приведены для нормальных чисел; специальное представление субнормальных чисел позволяет представлять даже меньшие числа (с некоторой потерей точности). Например, наименьшее положительное число, которое может быть представлено в двоичном формате 64, равно 2 −1074 ; Вклады в фигуру -1074 включают значение E min -1022 и все, кроме одного, из 53 битов значащей (2 -1022 - (53-1)  = 2 -1074).

Десятичные цифры - это цифры × log 10 по основанию. Это дает приблизительную точность в количестве десятичных цифр.

Десятичный E max равен Emax × log 10 по основанию. Это дает приблизительное значение максимального десятичного показателя степени.

Форматы binary32 (одинарный) и binary64 (двойной) - два наиболее распространенных формата, используемых сегодня. На рисунке ниже показана абсолютная точность для обоих форматов в диапазоне значений. Этот рисунок можно использовать для выбора подходящего формата с учетом ожидаемого значения числа и требуемой точности.

Точность binary32 и binary64 в диапазоне от 10 −12 до 10 12

Пример макета для 32-битной плавающей запятой :

Пример с плавающей точкой example.svg

и 64-битная компоновка аналогична.

Расширенные и расширяемые форматы точности

Стандарт определяет необязательные расширенные и расширяемые форматы точности, которые обеспечивают большую точность, чем базовые форматы. Формат расширенной точности расширяет базовый формат за счет большей точности и большего диапазона экспонент. Расширяемый формат точности позволяет пользователю указать точность и диапазон экспоненты. Реализация может использовать любое внутреннее представление, выбранное для таких форматов; все, что необходимо определить, - это его параметры ( b, p и emax). Эти параметры однозначно описывают набор конечных чисел (комбинации знака, значения и экспоненты для данного основания системы счисления), которые он может представлять.

Стандарт рекомендует, чтобы языковые стандарты обеспечивали метод определения p и emax для каждой поддерживаемой базы b. Стандарт рекомендует, чтобы языковые стандарты и реализации поддерживали расширенный формат, который имеет большую точность, чем самый большой базовый формат, поддерживаемый для каждого основания b. Для расширенного формата с точностью между двумя основными форматами диапазон экспоненты должен быть таким же большим, как и для следующего более широкого базового формата. Так, например, 64-битное двоичное число с расширенной точностью должно иметь emax не менее 16383. 80-битный расширенный формат x87 соответствует этому требованию.

Форматы обмена

Форматы обмена предназначены для обмена данными с плавающей запятой с использованием битовой строки фиксированной длины для заданного формата.

Двоичный

Для обмена двоичными числами с плавающей запятой определены форматы обмена длиной 16 бит, 32 бита, 64 бита и любое кратное 32 бит ≥ 128. 16-битный формат предназначен для обмена или хранения небольших чисел (например, для графики).

Кодирующая схема для этих бинарных форматов обмена такой же, как и IEEE 754-1985: бит знака, а затем ш показателя бит, которые описывают показатель степени смещения с помощью смещения, а р  - 1 бит, которые описывают мантиссу. Ширина поля экспоненты для k- битного формата вычисляется как w  = round (4 log 2 ( k)) - 13. Существующие 64- и 128-битные форматы следуют этому правилу, но 16- и 32-битные форматы имеют больше битов экспоненты (5 и 8 соответственно), чем дает эта формула (3 и 7 соответственно).

Как и в случае с IEEE 754-1985, поле смещенной экспоненты заполняется всеми 1 битами, чтобы указать либо бесконечность (конечное поле значимости = 0), либо NaN (конечное поле значимости 0). Для NaN, тихие NaN и сигнальные NaN различаются исключительно использованием самого старшего бита конечного поля значимости, а полезная нагрузка переносится в оставшихся битах.

Десятичный

Для обмена десятичными числами с плавающей запятой определены форматы обмена, кратные 32 битам. Как и в случае двоичного обмена, схема кодирования для форматов десятичного обмена кодирует знак, показатель степени и значение. Определены два разных кодирования на уровне битов, и обмен затруднен тем фактом, что может потребоваться некоторый внешний индикатор используемого кодирования.

Эти две опции позволяют кодировать мантиссу как сжатую последовательность десятичных цифр с использованием плотно упакованной десятичной дроби или, альтернативно, как двоичное целое число. Первый более удобен для прямой аппаратной реализации стандарта, а второй больше подходит для программной эмуляции на двоичном компьютере. В любом случае набор чисел (комбинации знака, значащей и экспоненты), которые могут быть закодированы, идентичен, а специальные значения (± ноль с минимальным показателем степени, ± бесконечность, тихие NaN и сигнальные NaN) имеют идентичное кодирование.

Правила округления

Стандарт определяет пять правил округления. Первые два правила округляются до ближайшего значения; остальные называются направленными округлениями :

Округление до ближайшего

  • Округлить до ближайшего, завязать до четного  - округление до ближайшего значения; если число выпадает на полпути, оно округляется до ближайшего значения с четной младшей цифрой; это значение по умолчанию для двоичных чисел с плавающей запятой и рекомендованное значение по умолчанию для десятичных чисел.
  • Округлить до ближайшего, завязать от нуля  - округление до ближайшего значения; если число падает на полпути, оно округляется до ближайшего значения выше (для положительных чисел) или ниже (для отрицательных чисел); это предназначено как опция для десятичных чисел с плавающей запятой.

Направленные округления

  • Округление в сторону 0  - направленное округление в сторону нуля (также известное как усечение).
  • Округление в сторону + ∞  - направленное округление в сторону положительной бесконечности (также известное как округление вверх или потолок).
  • Округление в сторону −∞  - направленное округление в сторону отрицательной бесконечности (также известное как округление вниз или пол).
Пример округления до целых чисел с использованием правил IEEE 754
Режим Пример значения
+11,5 +12,5 -11,5 -12,5
до ближайшего, привязки к четному +12,0 +12,0 -12,0 -12,0
до ближайшего, привязки от нуля +12,0 +13,0 -12,0 -13,0
к 0 +11,0 +12,0 -11,0 -12,0
в сторону + ∞ +12,0 +13,0 -11,0 -12,0
в сторону −∞ +11,0 +12,0 -12,0 -13,0

Если не указано иное, результат операции с плавающей запятой определяется путем применения функции округления к бесконечно точному (математическому) результату. Такая операция называется правильно округленной. Это требование называется правильным округлением.

Необходимые операции

Обязательные операции для поддерживаемого арифметического формата (включая базовые форматы) включают:

  • Арифметические операции (сложение, вычитание, умножение, деление, извлечение квадратного корня, объединенное умножение – сложение, остаток)
  • Преобразования (между форматами, в строки и из строк и т. Д.)
  • Масштабирование и (для десятичных) квантование
  • Копирование и манипулирование знаком (абс, отрицание и т. Д.)
  • Сравнения и общий заказ
  • Классификация и тестирование NaN и т. Д.
  • Тестирование и установка флагов
  • Разные операции.

Предикаты сравнения

Стандарт предоставляет предикаты сравнения для сравнения одного элемента данных с плавающей запятой с другим в поддерживаемом арифметическом формате. Любое сравнение с NaN считается неупорядоченным. −0 и +0 сравниваются как равные.

Предикат тотального упорядочивания

Стандарт предоставляет предикат totalOrder, который определяет общий порядок канонических членов поддерживаемого арифметического формата. Предикат согласуется с предикатами сравнения, когда одно число с плавающей запятой меньше другого. TotalOrder предикат не налагает полный порядок на все кодировки в формате. В частности, он не делает различий между разными кодировками одного и того же представления с плавающей запятой, например, когда одна или обе кодировки являются неканоническими. IEEE 754-2019 включает пояснения к totalOrder.

Для двоичных форматов обмена, кодирование которых соответствует рекомендациям IEEE 754-2008 по размещению сигнального бита NaN, сравнение идентично тому, когда тип каламбура заменяет числа с плавающей запятой на знаковое целое число (при условии, что порядок полезной нагрузки соответствует этому сравнение), старый трюк для сравнения FP без FPU.

Обработка исключений

Стандарт определяет пять исключений, каждое из которых возвращает значение по умолчанию и имеет соответствующий флаг состояния, который поднимается при возникновении исключения. Никакой другой обработки исключений не требуется, но рекомендуются дополнительные альтернативы не по умолчанию (см. § Альтернативная обработка исключений).

Пять возможных исключений:

  • Недопустимая операция: математически не определено, например, квадратный корень из отрицательного числа. По умолчанию возвращает qNaN.
  • Деление на ноль: операция с конечными операндами дает точный бесконечный результат, например, 1/0 или log (0). По умолчанию возвращает ± бесконечность.
  • Переполнение: конечный результат слишком велик для точного представления ( т. Е. Его показатель степени с неограниченным диапазоном показателей будет больше, чем emax). По умолчанию возвращает ± бесконечность для режимов округления до ближайшего (и следует правилам округления для режимов направленного округления).
  • Недополнение: результат очень мал (за пределами нормального диапазона). По умолчанию возвращает число, меньшее или равное минимальному положительному нормальному числу по величине (в соответствии с правилами округления); субнормально всегда подразумевает сгущенное исключение, но по умолчанию, если это точно, ни один флаг не поднимаются.
  • Неточность: точный ( т. Е. Неокругленный) результат не представляется точно. По умолчанию возвращает правильно округленный результат.

Это те же пять исключений, которые были определены в IEEE 754-1985, но исключение деления на ноль было распространено на операции, отличные от деления.

Некоторые реализации десятичных чисел с плавающей запятой определяют дополнительные исключения, которые не являются частью IEEE 754:

  • Фиксация: экспонента результата слишком велика для формата назначения. По умолчанию к коэффициенту добавляются завершающие нули, чтобы уменьшить показатель степени до наибольшего полезного значения. Если это невозможно (потому что это приведет к тому, что количество цифр должно быть больше, чем формат назначения), возникает исключение переполнения.
  • Округлено: коэффициент результата требует большего количества цифр, чем предоставляет формат назначения. Если отбрасываются любые ненулевые цифры, сигнализируется неточное исключение.

Кроме того, такие операции, как квантование, когда один из операндов бесконечен или результат не соответствует формату назначения, также будут сигнализировать об исключении недопустимой операции.

Рекомендации

Альтернативная обработка исключений

Стандарт рекомендует необязательную обработку исключений в различных формах, включая предварительную подстановку значений по умолчанию, определенных пользователем, и ловушки (исключения, которые каким-то образом изменяют поток управления) и другие модели обработки исключений, которые прерывают поток, например try / catch. Ловушки и другие механизмы исключения остаются необязательными, как это было в IEEE 754-1985.

Рекомендуемые операции

В разделе 9 стандарта рекомендуются дополнительные математические операции, которые должны быть определены в языковых стандартах. Для соответствия стандарту ничего не требуется.

Рекомендуемые арифметические операции, которые необходимо правильно округлить:

Функции asinPi, acosPi и tanPi не входили в стандарт IEEE 754-2008, поскольку считались менее необходимыми. Были упомянуты asinPi, acosPi, но это было расценено как ошибка. Все три были добавлены в редакции 2019 года.

К рекомендуемым операциям также относятся установка направления округления в динамическом режиме и доступ к нему, а также операции уменьшения вектора, определяемые реализацией, такие как сумма, масштабированное произведение и скалярное произведение, точность которых не указана стандартом.

С 2019 года также рекомендуются расширенные арифметические операции для двоичных форматов. Эти операции, указанные для сложения, вычитания и умножения, производят пару значений, состоящую из результата, правильно округленного до ближайшего в формате, и члена ошибки, который можно точно представить в формате. На момент публикации стандарта аппаратные реализации не известны, но очень похожие операции уже были реализованы в программном обеспечении с использованием хорошо известных алгоритмов. История и мотивация их стандартизации описаны в справочном документе.

С 2019 года ранее требуемые minNum, maxNum, minNumMag и maxNumMag в IEEE 754-2008 теперь удалены из-за их неассоциативности. Вместо этого рекомендуется два набора новых минимальных и максимальных операций. Первый набор содержит минимум, минимум, максимум и максимум. Второй набор содержит minimumMagnitude, minimumMagnitudeNumber, maximumMagnitude и maximumMagnitudeNumber. История и мотивация этого изменения объясняются в справочном документе.

Оценка выражения

Стандарт рекомендует, как языковые стандарты должны определять семантику последовательностей операций, и указывает на тонкости буквальных значений и оптимизаций, которые изменяют значение результата. Напротив, в предыдущей версии стандарта 1985 г. аспекты языкового интерфейса оставались неопределенными, что приводило к несогласованному поведению между компиляторами или различным уровням оптимизации в оптимизирующем компиляторе.

Языки программирования должны позволять пользователю указывать минимальную точность для промежуточных вычислений выражений для каждой системы счисления. В стандарте это называется предпочтительной шириной, и должна быть возможность устанавливать ее для каждого блока. Промежуточные вычисления в выражениях следует рассчитывать и сохранять любые временные параметры с использованием максимальной ширины операндов и предпочтительной ширины, если она установлена. Таким образом, например, компилятор, ориентированный на оборудование с плавающей запятой x87, должен иметь средства указания того, что промежуточные вычисления должны использовать формат с двойным расширением. Сохраненное значение переменной должно всегда использоваться при вычислении последующих выражений, а не любого предшественника до округления и присвоения переменной.

Воспроизводимость

Версия стандарта IEEE 754-1985 допускает множество вариантов реализации (например, кодирование некоторых значений и обнаружение определенных исключений). IEEE 754-2008 сократил эти допуски, но все еще остается несколько вариантов (особенно для двоичных форматов). Пункт о воспроизводимости рекомендует, чтобы языковые стандарты предоставляли средства для написания воспроизводимых программ (т. Е. Программ, которые будут давать одинаковый результат во всех реализациях языка), и описывает, что необходимо сделать для достижения воспроизводимых результатов.

Представление персонажа

Стандарт требует операций для преобразования между базовыми форматами и внешними форматами последовательности символов. Преобразование в формат десятичных символов и обратно требуется для всех форматов. Преобразование во внешнюю последовательность символов должно быть таким, чтобы обратное преобразование с использованием округления до ближайшего, привязки к четному восстановило исходное число. Нет требования сохранять полезную нагрузку тихого NaN или сигнального NaN, а преобразование из внешней последовательности символов может превратить сигнальный NaN в тихий NaN.

Исходное двоичное значение будет сохранено путем преобразования в десятичное и обратно с использованием:

  • 5 десятичных цифр для двоичного16,
  • 9 десятичных цифр для binary32,
  • 17 десятичных цифр для binary64,
  • 36 десятичных цифр для двоичного 128.

Для других двоичных форматов необходимое количество десятичных цифр составляет

1 + п бревно 10 ( 2 ) , {\ displaystyle 1+ \ lceil p \ log _ {10} (2) \ rceil,}

где p - количество значащих битов в двоичном формате, например, 237 бит для двоичного256.

При использовании десятичного формата с плавающей запятой десятичное представление будет сохранено с использованием:

  • 7 десятичных цифр для decimal32,
  • 16 десятичных цифр для decimal64,
  • 34 десятичных цифры для decimal 128.
См. Также: Арифметика с плавающей запятой § Преобразование двоичного числа в десятичное с минимальным количеством цифр

Алгоритмы с кодом для корректного преобразования из двоичного в десятичное и из десятичного в двоичное обсуждают Гей, а для тестирования - Паксон и Кахан.

Смотрите также

Примечания

использованная литература

Стандарты

Вторичные ссылки

дальнейшее чтение

внешние ссылки

Последняя правка сделана 2023-03-19 07:18:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте