Что считает инженерный калькулятор
Калькулятор принимает выражение целиком, как его записывают на бумаге: со скобками, степенями, функциями и факториалом. Результат пересчитывается при каждом изменении строки. Рядом видно то же выражение, посчитанное в градусах и в радианах, и по этой паре чисел проще всего заметить, что выбран не тот режим углов.
Ответ показывается с двенадцатью значащими цифрами. Цифры дальше шестнадцатого знака для числа двойной точности уже шум, и показывать их значило бы обещать точность, которой нет.
Как заполнить поле
Пишите выражение в поле ввода или набирайте кнопками. Кнопки вставляют текст в позицию курсора, поэтому порядок набора не важен.
Числа записываются обычные и десятичные: 2, 0.5, 2e3 (это 2000). Операции: +, -, *, /, ^ для степени. Знаки −, ×, ÷ из вставленного текста тоже понимаются. Функции: sin, cos, tan, asin, acos, atan, log (десятичный), ln (натуральный), sqrt, abs, exp. Константы: π или pi, а также e. Постфиксы: ! для факториала и % для процента, так что 5! равно 120, а 50% равно 0,5.
Знак умножения можно не ставить: 2π, 3(1+2) и 2sin(30) читаются как умножение. Степень связывает справа налево, поэтому 2^3^2 это 29 = 512, а не 82. Унарный минус слабее степени: -2^2 даёт −4, а (-2)^2 даёт 4.
Факториал и процент прилипают к ближайшему значению: 200*10% считается как 200 · 0,1 = 20, а не как 200 · 10 с последующим процентом от результата.
Градусы и радианы
Режим углов влияет только на тригонометрию. sin(30) в градусах даёт 0,5, а в радианах −0,988031624093: 30 радиан это почти пять полных оборотов, угол совсем другой. Обратные функции работают в ту же сторону: asin(0.5) в градусах равен 30, в радианах 0,523598775598.
Тангенс в точках, где косинус равен нулю, не существует. Калькулятор не выдаёт там огромное число, а пишет: «Тангенс не определён: угол кратен 90°». Проверка идёт по косинусу с порогом 10−12, поэтому tan(90) и tan(270) в градусах дают объяснение, а tan(89.99) считается нормально.
Как получается результат
Введённая строка разбирается на токены, затем рекурсивным спуском собирается дерево выражения, и только после этого дерево вычисляется. Введённый текст нигде не исполняется как код: калькулятор понимает ровно ту грамматику, которая описана выше, и ничего сверх неё.
Контрольный пример: sin(30)+cos(60) в градусах, ровно то, что видно на экране при открытии страницы.
- 30° переводятся в радианы: 30 · π / 180 = 0,5235987755982988.
- Синус этого угла в двоичной арифметике равен 0,49999999999999994, чуть меньше половины.
- 60° дают 1,0471975511965976 радиан, косинус равен 0,5000000000000001, чуть больше половины.
- Сумма двух слагаемых равна ровно 1, и на экране появляется
1.
На шагах 2 и 3 каждое слагаемое отличается от 0,5 в последнем разряде, но ошибки противоположны по знаку и сокращаются. Совпадение с единицей получилось из этих конкретных значений, а не из общего правила.
Почему sin(180°) не равен нулю
Перевод 180° в радианы даёт 3,141592653589793, ближайшее к π число двойной точности, а не само π. Синус этого числа равен 1,22464679915·10−16, и калькулятор показывает его, а не ноль. Формат хранит 53 значащих бита, и его предельная относительная точность 2−52 ≈ 2,22·10−16.
Опыт внизу страницы показывает, как остаток растёт с номером полуоборота: для sin(180°), sin(360°) и sin(540°) он равен 1,22·10−16, 2,45·10−16 и 3,67·10−16. Ошибка накапливается линейно вместе с углом.
Где модель останавливается
- Только вещественные числа.
sqrt(-4)даёт сообщение об ошибке, а не 2i: комплексных чисел в модели нет. - Факториал до 170!. Значение 170! ≈ 7,25741561531·10306 помещается в двойную точность, 171! уже нет, и калькулятор говорит об этом прямо.
- Никакой символьной алгебры. Выражения не упрощаются, переменных нет:
xв поле это ошибка, а не неизвестное. - Двенадцать значащих цифр на экране. Промежуточные вычисления идут в полной точности, но разницу меньше 10−12 на дисплее не увидеть. Где важен каждый последний разряд, нужен отдельный расчёт с оценкой погрешности.
Источники
- IEEE 754-2019, Standard for Floating-Point Arithmetic: формат binary64, 53-битная мантисса, машинное эпсилон 2−52.
- Goldberg D. What Every Computer Scientist Should Know About Floating-Point Arithmetic // ACM Computing Surveys, 1991, 23(1): 5–48.
- Дейкстра Э. Recursive Programming // Numerische Mathematik, 1960: разбор выражений без исполнения текста как программы.
- Значения 170! и 171! сверены прямым вычислением, определение тангенса и область его существования взяты из стандартного курса анализа.