О калькуляторе
Это калькулятор!!!
У нас нет цели заставить его решать что-либо.
Для этого есть 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. подсветка синтаксиса