О калькуляторе
Это калькулятор!!!
У нас нет цели заставить его решать что-либо.
Для этого есть Wolfram и Photomath.
У нас нет цели заставить его строить графики.
Для этого есть Desmos.
Он предназначен для очень точных и быстрых расчётов (например при написании отборочных этапов по математике), а так же работы с системами счисления (например при написании отборочных этапов по информатике).
А вообще это мой pet-проект.
Настройки
Точность: 10**
Округление:
Руководство
Операторы:
| Оператор | Приоритет | Описание | Скорость |
|---|---|---|---|
| | | 9 (низший) |
Битовое ИЛИ * | O(log max(a,b)) |
| ^ | 8 | Битовое исключающее ИЛИ (XOR) * | O(log max(a,b)) |
| & | 7 | Битовое И * | O(log max(a,b)) |
| << | 6 | Битовый сдвиг влево * | O(log a ∙ b) |
| >> | 6 | Битовый сдвиг вправо * | O(log a ∙ b) |
| + | 5 | Сложение | O(log max(a,b)) |
| - | 5 | Вычитание | O(log max(a,b)) |
| * | 4 | Умножение | O(log max(a,b) ∙ log log max(a,b)) |
| / | 4 | Деление | O(log max(a,b) ∙ log log max(a,b)) ? |
| // | 4 | Целочисленное деление * | O(log max(a,b) ∙ log log max(a,b)) ? |
| % | 4 | Остаток от деления * | O(log max(a,b) ∙ log log max(a,b)) ? |
| ** | 3 | Возведение в степень | Для целых: O(log a ∙ b) Для вещественных: O(log2 a) |
| ! | 2 | Работает как fact(a) | O(a2) |
| - (~~) | 1 (наивысший) |
Унарный минус | O(1) |
| * - операнды округляются функцией round | |||
| ? - асимптотика определена приблизительно | |||
Запись числа:
| Шаблон | Примеры | Описание |
|---|---|---|
| <Цел ч>[.<Дроб ч>] | 255 9.8 3.14 |
Число в десятичной системе счисления [с дробной частью] |
| 0x<Цел ч>[.<Дроб ч>] | 0xff 0x9.c 0x3.23 |
Число в шестнадцатеричной системе счисления [с дробной частью] |
| 0o<Цел ч>[.<Дроб ч>] | 0o377 0o11.6 0o3.106 |
Число в восьмеричной системе счисления [с дробной частью] |
| 0b<Цел ч>[.<Дроб ч>] | 0b11111111 0b1001.11 0b11.001 |
Число в двоичной системе счисления [с дробной частью] |
| <Основание>b<Цел ч>[.<Дроб ч>] | 7b513 5b14.4 11b3.15a |
Число в заданной системе счисления [с дробной частью] 1<=Основание<=62 |
| <Основание>@<Цел ч>[;<Дроб ч>] | 128@001 127 90@09;72 140@3;19 84 |
Число в заданной системе счисления [с дробной частью] 2<=Основание |
| 0f<Цел ч>[;<Дроб ч>] | 0f100001000001 0f10001.1001 0f100.000010101 |
Число в фибоначчиевой системе счисления [с дробной частью] |
| 0!<Цел ч>[.<Дроб ч>] | 0!2 0 2 1 1 0!1 1 1;1 1 3 1 0!1 1;0 0 3 1 5 |
Число в факториальной системе счисления [с дробной частью] |
| <Основание>s<Цел ч>[;<Дроб ч>] | 3s1 0 0 1 1 0 5s2 0;-1 0 2 7s3;1 0 0 -3 |
Число в симметричной системе счисления [с дробной частью] |
| <Цел ч>[.<Дроб ч>]e[+-]<Порядок> | 2.55e2 98e-1 .314e1 |
Экспоненциальная запись числа |
| <Основание>nb<Цел ч>[.<Дроб ч>] | 5nb13140 10nb190.2 15nb4.d23e |
Число в нега-позиционной системе счисления [с дробной частью] 2<=Основание<=62 |
| <Основание>n@<Цел ч>[;<Дроб ч>] | 5n@1 3 1 4 0 10n@1 9 0;2 99n@4;85 2 25 |
Число в нега-позиционной системе счисления [с дробной частью] 2<=Основание |
| 0r<Цел ч> | 0rCCLV 0rXCVIII/0rX 0rXXXI/0rX |
Число в римской системе счисления |
| В одной формуле могут встречаться разные виды записи чисел | ||
Нативные функции (с поддержкой длинной арифметики):
| Название | Описание | Скорость |
|---|---|---|
| min(arg...) | Возвращает наименьшее из двух или более чисел | O(arg.length) |
| max(arg...) | Возвращает наибольшее из двух или более чисел | O(arg.length) |
| abs(a) | Абсолютное значение числа (модуль числа) | O(log a) |
| ceil(a) | Округляет аргумент до ближайшего большего целого | O(log a) |
| floor(a) | Округляет аргумент до ближайшего меньшего целого | O(log a) |
| round(a) | Возвращает число, округлённое к ближайшему целому | O(log a) |
| trunc(a) | Возвращает целую часть числа путём удаления всех дробных знаков | O(log a) |
| random(a) | Генерирует псевдослучайное число в диапазоне от 0 (включительно) до a(не включая само значение) | O(log n) |
| sign(a) | Возвращает 1 0 -1, если число положительное, ноль или отрицательное соответственно | O(1) |
| sqrt(a) | Квадратный корень | O(log a ∙ log sqrt a) |
| sqrt<b>(a) | Корень b-й степени b ∈ ℕ | O(log2 a) |
| sqrt(a, b) | Корень b-й степени | O(log2 a) |
| log<b>(a) | Логарифм с основанием b ∈ ℕ | O(log2 a) |
| log(a, b) | Логарифм с основанием b | O(log2 a) |
| ln(a) | Натуральный логарифм | O(log2 a) |
| exp(a) | Экспонента ea | O(inv_fact(1/eps) ∙ log a) |
| fact(a) | Факториал a! Для вещественных чисел использует аппроксимацию, что даёт погрешность в ~20 знаков |
O(a2) |
| gcd(arg...) | Наибольший общий делитель | O(log max(arg)) |
| lcm(arg...) | Наименьшее общее кратное | O(log max(arg)) |
| fib(a) | a-е число последовательности Фибоначчи | O(log2 a) |
| isprime(a) | Возвращает 1 или 0 в зависимости от простоты a | O(log3 a) |
| nextprime(a) | Возвращает наименьшее простое число, которое больше чем a | O(log3 a) |
| lastprime(a) | Возвращает наибольшее простое число, которое меньше чем a | O(log3 a) |
| phi(a) | Функция Эйлера. Возвращает значение которой равно количеству натуральных чисел, не превышающих a и взаимно простых с ним | В худшем случае O(sqrt a) |
| minpd(a) | Возвращает наименьший делитель | В худшем случае O(sqrt a) |
| maxpd(a) | Возвращает наибольший простой делитель | В худшем случае O(sqrt a) |
| maxd(a) | Возвращает наибольший делитель | В худшем случае O(sqrt a) |
| hypot(arg...) | Возвращает квадратный корень из суммы квадратов своих аргументов | O(log max |arg| ∙ log sqrt max |arg|) |
| memset(b,v) | Аналогично вызову memset2d(0,b,v) | O(log arg) |
| memset(b,v,r) | Аналогично вызову memset2d(0,b,v,r) | O(log arg) |
| memget(b) | Аналогично вызову memget2d(0,b) | O(log arg) |
| memget(b,r) | Аналогично вызову memget2d(0,b,r) | O(log arg) |
| memset2d(a,b,v) | Сохраняет значение v в ассоциативном массиве с индесами a и b. Если значение пришлось переписать, то возвращает 0, иначе возвращает 1 | O(log arg) |
| memset2d(a,b,v,r) | Сохраняет значение v в ассоциативном массиве с индесами a и b. Возвращает r | O(log arg) |
| memget2d(a,b) | Возвращает значение из ассоциативного массива с индесами a и b. В случае отсутствия значения генерирует исключение | O(log arg) |
| memget2d(a,b,r) | Возвращает значение из ассоциативного массива с индесами a и b. В случае отсутствия значения возвращает r | O(log arg) |
| atan2(y, x) | Возвращает арктангенс от частного своих аргументов | O(log2 a) |
| sin(a) | Возвращает синус числа | O(log2 a) |
| cos(a) | Возвращает косинус числа | O(log2 a) |
| tg(a) | Возвращает тангенс числа | O(log2 a) |
| ctg(a) | Возвращает котангенс числа | O(log2 a) |
| sec(a) | Возвращает секанс числа | O(log2 a) |
| cosec(a) | Возвращает косеканс числа | O(log2 a) |
| asin(a) (arcsin) | Возвращает арксинус числа | O(log2 a) |
| acos(a) (arccos) | Возвращает арккосинус числа | O(log2 a) |
| atg(a) (arctg) | Возвращает арктангенс числа | O(log2 a) |
| actg(a) (arcctg) | Возвращает арккотангенс числа | O(log2 a) |
| asec(a) (arcsec) | Возвращает арксеканс числа | O(log2 a) |
| acosec(a) (arccosec) | Возвращает арккосеканс числа | O(log2 a) |
| sh(a) (sinh) | Возвращает гиперболический синус числа | O(log2 a) |
| ch(a) (cosh) | Возвращает гиперболический косинус числа | O(log2 a) |
| th(a) (tanh) | Возвращает гиперболический тангенс числа | O(log2 a) |
| cth(a) (coth) | Возвращает гиперболический котангенс числа | O(log2 a) |
| sch(a) (sech) | Возвращает гиперболический секанс числа | O(log2 a) |
| csch(a) (cosech) | Возвращает гиперболический косеканс числа | O(log2 a) |
| ash(a) (arsh) | Возвращает обратный гиперболический синус числа (ареа-синус) | O(log2 a) |
| aсh(a) (arсh) | Возвращает обратный гиперболический косинус числа (ареа-косинус) | O(log2 a) |
| ath(a) (arth) | Возвращает обратный гиперболический тангенс числа (ареа-тангенс) | O(log2 a) |
| acth(a) (arcth) | Возвращает обратный гиперболический котангенс числа (ареа-котангенс) | O(log2 a) |
| asech(a) (arsch) | Возвращает обратный гиперболический секанс числа (ареа-секанс) | O(log2 a) |
| acsch(a) (arcsch) | Возвращает обратный гиперболический косеканс числа (ареа-косеканс) | O(log2 a) |
Константы (переменные):
| Название | Описание | Примерное значение |
|---|---|---|
| pi | Число π | 3.14159 |
| e | число Эйлера (число Непера) | 2.71828 |
| f | Золотое сечение | 1.61803 |
| g | Ускорение свободного падения на Земле π2 |
9.8696 |
| eps | Машинный эпсилон | 0.000...0001 |
Прединтерпретируемые теги (π-теги):
| π-тег | Пример | Описание |
|---|---|---|
| /* ... */ | 1/*коммент*/2 | Комментарий Работает перед всеми остальными тегами |
| {var a s} | {var cube 20} {cube}*{cube}*{cube} |
Тег объявления. Заменяет все последующие вхождения строки {a} на s. s не должен содержать пробелов, а a может состоять только из строчных и заглавные букв латинского алфавита, а так же из цифр. |
| {for a i j} | 0 {for i 1 100} +isprime({i}) |
Тег перебора. Перебирает k от i до j и для каждого заменяет все вхождения строки {a} на k. Результаты конкатенирует. i и j - целые не отрицательные числа, а a может состоять только из строчных и заглавные букв латинского алфавита. |
| {calc} | {calc}2+2 | Тег расчета. Рассчитывает содержимое и вставляет возвращаемое значение с 20 знаками после запятой |
| {calc a} | {calc 10}pi | Тег расчета. Рассчитывает содержимое и вставляет возвращаемое значение с a знаками после запятой |
| {varcalc a s} | {varcalc p 2+2} | Тег объявления с расчета. Работает как {var a {calc}s{end}} |
| {varcalc a s b} | {varcalc p 2+2 3} | Тег объявления с расчета. Работает как {var a {calc b}s{end}} |
| {end} | max(0 {for i 0 100} ,({i}-50)**2 {end}) |
Тег остановки. Служит флагом для конца for-a или calc-a |
Не нативные функции (точность ~1e-10):
| Название | Описание | Скорость |
|---|
Как это работает?
2 декабря 2018 в JavaScript добавился тип BigInt, который позволил проводить расчёты с числами больше 9007199254740991.
Для хранения вещественной части воспользуемся хитростью: будем число умножать на некоторую константу (Далее W).
Общий вид W = 1000...000n
W = 1/<точность вычислений> = 1/eps
Например число 123.456 будет храниться как 123456000...000n
Можно заметить, что W = 1
Для сложения и вычитания ничего не меняется. Мы будем просто складывать числа.
Например: 123.456 + 654.321 => 123456000...000n + 654321000...000n => 777777000...000n => 777.777
Для умножения и деления воспользуемся формулами:
A * B => A * B / W
A / B => A * W / B
Например: 1 / 3 => (1000...000n(A) * 1000...000n(W)) / 3000...000n(B) => 333...333n => 0.333...333
Остальные функции работают по аналогии
Доказательство тьюринг полноты (правило 110)
{varcalc value 0b101}
/*Первоначальное значение*/
{var step 4}
/*Количество шагов*/
{varcalc u1 memset(0,{value})}
/*Инициализируем первую переменную*/
{for k 1 {step}}
/*Делаем заданное число шагов*/
{varcalc cnt{k} floor(log2(memget(0)+.9))+1}
/*количество бит в числе*/
{varcalc u2 memset(1,0)}
/*Инициализируем вторую переменную*/
{for i 0 {cnt{k}}}
/*Перебираем все биты будущего числа*/
{varcalc p{k}p{i} (memget(0)>>({i}+1))&1}
/*Правый прошлый бит*/
{varcalc q{k}q{i} (memget(0)>>{i})&1}
/*Средний прошлый бит*/
{varcalc r{k}r{i} (memget(0)>>({i}-1))&1}
/*Левый прошлый бит*/
{varcalc v{k}v{i} ({q{k}q{i}}+{r{k}r{i}}+{q{k}q{i}}*{r{k}r{i}}+{p{k}p{i}}*{q{k}q{i}}*{r{k}r{i}})&1}
/*Результирующий бит*/
{varcalc u3 memset(1,memget(1)+{v{k}v{i}}*(1<<{i}))}
/*Сохраняем результат*/
{end}
{varcalc u4 memset(0,memget(1))}
/*Переносим значение второй переменной в первую*/
{end}
/*Выводим результат*/
{varcalc cnt floor(log2(memget(0)+.9))}
{for j 0 {cnt}}{calc}(memget(0)>>({cnt}-{j}))&1{end}Как добавить свою функцию?
Для выполнения в консоли (F12 или Ctrl + Shift + J)
Не нативно:
Math.cube=(a)=>{return a*a*a}Пример использования: nn_cube(5)
Нативно:
cl_add_function('cube',(a,w)=>{
// a - массив аргументов
if (a.length!=1) return; // проверяем что аргумент один
return (a[0]**3n)/(w*w); // возвращаем значение
})Пример использования: cube(5)
Список чего можно добавить потом:
1. арифметика по модулю
2. подсветка синтаксиса