Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 30.04.2022 в Сообщения

  1. 1 балл
    Попробуйте угадать, что будет выведено на экран в результате выполнения нижеприведенного кода: N=1e16 if N+1 > N then print("Норма") else print("Лажа") end Если вы твердо уверены, что N+1 заведомо больше N и ваш ответ "Норма", то вы, наверное, будете несколько удивлены, когда выполните этот код на компьютере. Дело в том, что Луа хранит числовые значения в формате с плавающей запятой. Это означает, что каким бы большим число ни было, оно всегда занимает в памяти компьютера одинаковое место, а значит, чем больше число, тем меньше точность, с какой оно хранится. И при достаточно большом N точности, что бы увеличить его на единицу оказывается недостаточно. Избежать подобной проблемы поможет тип данных, который я назвал "Метачисла". На самом деле метачисла являются луа-таблицами, но большинство арифметических операций с ними можно проводить также как и с обычными числами. С той лишь разницей, что размер памяти, занимаемой метачислом, ограничивается только памятью компьютера, а значит, метачисло может принимать сколь угодно большие значения, не теряя при этом точности. Метачисло может быть создано при помощи библиотеки metanum pastebin get PsMFQame lib/metanum.lua Библиотека содержит единственную функцию – функцию создания метачисла. metanum([num[,divprec]]) Параметр num определяет начальное значение метачисла и может быть обычным числом, строкой или другим метачислом. Если параметр отсутствует, будет создано метачисло равное нулю. Параметр divprec ограничивает точность метачисла при выполнении операции деления. При делении некоторых чисел, скажем 1 на 3, может возникнуть бесконечная дробь, которая без такого ограничения заняла бы всю память компьютера. Чем больше divprec, тем больше значащих цифр может содержать метачисло. По умолчанию это число равняется 32. Мета числа можно складывать, вычитать, умножать и делить, как между собой, так и с обычными числами. Результатом такой операции всегда будет метачисло. Метачисла можно возводить в степень, но степенью должно быть обычное число. Метачисла можно сравнивать с другими метачислами. Если у вас возникнет необходимость сравнить метачисло с числом, вы должны привести оба значения к одному типу. Пример нахождения факториала 300: mn=require("metanum") –- подключаем библиотеку f=mn(1) -- создаем метачисло, равное 1 for i=1,300 do f=f*i -- выполняем умножение 300 раз end print(f) -- выводим результат Пример нахождения степени двойки: mn=require("metanum") –- подключаем библиотеку two=mn(2) -- создаем метачисло, равное 2 print(two^1024) -- возводим в степень и выводим результат Как видим, после создания метачисла, с ним можно не задумываясь работать так же, как и с обычным числом. Но, к сожалению, над метачислами не могут быть выполнены функции библиотеки math. Однако, метачисла обладают некоторыми собственными функциями. К примеру, если мы имеем некое метачисло М, над ним можно выполнить такие действия: M:tonumber() – преобразует метачисло в число. Внимание! Возможна потеря точности. M:floor([n]) – возвращает целую часть метачисла. Если задан параметр n, отсекает, оставляя n знаков после запятой. M:abs() – возвращает абсолютное значение (модуль) метачисла. M:toexp() – преобразует метачисло к экспоненциальному виду. PS: стоит добавить, что арифметические операции над метачислами выполняются значительно медленнее, чем над обычными числами. Поэтому использовать метачисла следует только тогда, когда в этом действительно есть необходимость.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...