Как стать автором
Обновить

Комментарии 156

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

В реальной жизни такие большие числа не бывают такими точными. Поэтому 0 - правильный ответ.

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

А потом мы видим множество споров под простым 6÷2(1+2) и два калькулятора (один из которых инженерный, а второй студенты писали), показывающих разные ответы. Никто не вдается в подробности, почему именно знак перед скобкой опущен. Просто что-то такое смутно помнят со школы, мол, раз знака нет, значит умножение, а раз умножение, значит по порядку и решаем. Арифметика или алгебраика - не всё ли равно им? Представляете, даже такой простой пример, показывает, что перед тем как позволить пользоваться калькулятором, людям надо вручить ещё и инструкцию к нему. Да-да, из того же разряда, что и «сушить кошку в микроволновке запрещено». Так что да, написать грамотный калькулятор - весьма непростая задача... Благодарю за статью и пойду открою окно, а то надушнил вам тут)))

6÷2(1+2)

Тут всё (не)просто. Во-первых, есть раннее или строгое(сильное) связываение. 2a — это два А, а не просто А два раза. Потому что 2а/2а = 1 , а не а². Понимаете ? Во-вторых, в дробях всё, что числитель — это одно, а всё, что знаменатель — это другое. Дроби крутые сами по себе, а с рядами Тейлора/Фурье/Маклорена так просто мега имба. И можно было бы определить знак / как последовательное деление, а ÷ (обелюс) сделать знаком дроби в линейной записи. Точки обозначали бы числитель и знаменатель. Тогда 6÷2(1+2) становится (6)÷(2(1+2)). Ну и третье. Обратная польская нотация решает и даёт одназначность толкования. Писали же про стековый калькулятор. Автор ещё уточнил, что особенно любит их.

Что за бред...

2a – это просто другая запись 2×a. И из-за другой записи приоритет не меняется.

И не надо выдумывать, что было бы по-другому, то было бы круто.

Есть две разных нотации, ЕИНИП. В одной трактуется как простое 2×a, в другой эта операция трактуется как умножение с повышенным приоритетом. И, в зависимости от того, как человека выучили, он будет трактовать это так или иначе. Поэтому люди и спорили.

Можно ссылку на источник про повышенный приоритет? Закончил прикладную математику, а про это первый раз слышу.

Попробую объяснить: если 2a трактовать как простое умножение, то запись 2a/2a преобразуется в такую строку: 2×a/2×a, результат которой а². А если трактовать как умножение с приоритетом, то получается такая строка: (2×a)/(2×a). Результат соответственно 1.

Допустим. Но я не об этом спрашивал, а о каком-то документальном подтверждении понятия "умножение с приоритетом". У математиков есть LaTeX и ТеТрадь с ручкой, поэтому и нет нужды вводить какие-то новые понятия для однострочной записи сложных выражений.

Ну вот попытка перенести тетрадь с ручкой в компуктер как раз и начинает требовать эти понятия. Иначе будет, как в комментарии выше.

Умножение с приоритетом появляется в алгебраической нотации, в упрощенной записи, когда скобки и знаки умножения опускаются: например, (-b ± sqrt(b^2 + 4ac))/2a; при этом оно еще и опускается (не выражается отдельным знаком), и все переменные и коэффициенты считаются однобуквенными (если иное не оговорено явно), и применяется только внутри члена выражения, содержащего коэффициенты и переменные.

В том числе, оно опускается при выносе общего множителя за скобку.
И если вы захотите посчитать 7÷2(ax+b), то в знаменателе у вас должно оказаться 2(ax+b), а не просто 2.

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

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

И где там хоть слово про его использование в алгебраической нотации?

Давайте сначала вы конкретизируете, что именно значит "алгебраическая нотация" и какие ещё нотации бывают.

На самом деле, корова не моя. Но я могу пояснить своё виденье ситуации.

Есть две формы записи математических выражений:

  1. В строку, с использованием четырёх арифметических действий +,-,/,* (символы не важны) - используется как для числовых, так и для буквенных выражений. Дробная черта используется только в записи рациональных чисел.

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

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

Моё мнение - программа не должна работать с таковыми.

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

Не могу прокомментировать. Я скорее думал, что запись в строку применяется для упрощения учебного материала в младших классах. А потом от неё отказываются.

В компьютерной технике приходится ещё решать задачу человекочитаемой сериализации.

Уже говорил, что тоже писал свой однострочный калькулятор с самодельным парсером выражений. И введение дополнительных символов для умножения и деления, но с другими приоритетами, сильно повысило их читаемость.

И введение дополнительных символов для умножения и деления, но с другими приоритетами, сильно повысило их читаемость.

Охотно верю. Пожалуй, моё требование "не работать с другими нотациями" следует заменить на: "Вводя нестандартную нотацию следует прилагать её формальное описание".

Лично я в ограничениях на одну строку с минимальным количеством символов-операторов вижу не более чем инерцию мышления.

В коде запись формул возможна только в одну строку, насколько мне известно.

Вовсе нет, ascii-арт тому подтверждение. Просто этого ещё никто не сделал в публичном доступе.

Этот формат используется в Maxima для вывода. Но в качестве формата ввода у него есть недостатки: значимые отступы.

В некоторых текстовых редакторах есть режим, когда отступы слева вовсе не обязательно отбивать пробелом. Просто ставишь курсор в произвольное место экрана и всё.

MathCAD работал(-ет?) исключительно со второй нотацией. Очень сложно в ней работать без троганья мыши...

Тоже охотно верю. Пробовал.

то в знаменателе у вас должно оказаться

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

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

В любом случае, независимо от вашего понимания, правила, по которым записываются одни типы выражений, было применено туда, где обычно не применяется — что породило некорретного кадавра.

Чтобы не было бреда, надо, во-первых, даже денормализованные дроби записывать правильно. Во-вторых: явно указывать приоритеты скобками.

А если намеренно пишешь двусмысленную фигню и рассчитываешь, что тебя телепатически поймут — то это к другому доктору.

6÷2(1+2)

Любимая тема городских пабликов во ВКонтакте, чтобы в ходе срача выяснить кто тру-математик, а кто лошок.

Я бы сразу спросил, на каком это языке. Потому что я не знаю ни одного языка, в котором эта запись была бы валидным выражением.

Ну как раз-таки 2а это а два раза)) надеюсь, вы не программист))

Для некоторых математических выражений (типа 6÷2(1+2)) в принципе не существует однозначной интерпретации. В Википедии есть несколько абзацев на эту тему. Что-то типа undefined behaviour в языках программирования.

Да просто последовательность символов «6÷2(1+2)» не является математическим выражением, хотя и состоит из знаков, которые обычно используют для написания таковых. Это аналогично тому, что не любая комбинация операторов языка программирования является компьютерной программой.

6÷2(1+2)

На эту тему Борис Трушин достаточно емко сказал.

Недословно. Математическим выражением может являться только то выражение, которое понимается однозначно. Если выражение допускает вольности интерпретации, то оно не математическое.

понимается

Кем? :) Получается, на математичность влияет субъективный фактор — если человек не в курсе, что это выражение можно интерпретировать хотя бы двумя разными способами, то для него оно математическое, а для того, кто знает — не математическое.

И тогда получается, что математики видят в нем не математическое выражение, а не математики — математическое. Свой среди чужих, чужой среди своих. Забавно.

Кем? :) Получается, на математичность влияет субъективный фактор — если человек не в курсе, что это выражение можно интерпретировать хотя бы двумя разными способами, то для него оно математическое, а для того, кто знает — не математическое.

И тогда получается, что...

...Что ограниченность мышления даёт свои сайд-эффекты :)

Кем? 

Принятым алгоритмом интерпретации выражений, разумеется!

Какой-то бред. Это как позвонить в Labcenter Electronics и объяснить им, сколько раз и где именно они нарушили ЕСКД.

Противопоставляет алгебру и арифметику советское пособие для педагогов. Оно утверждает, что в алгебре "знак умножения связывает компоненты действия сильнее, чем знак деления" (зависимо от того, опускается ли знак): a ÷ bc = a ÷ b*c = a÷(b*c). При этом само дальше эту сомнительную практику не использует и делит горизонтальной чертой.

В одних калькуляторах Texas Instruments решили повысить приоритет неявного умножения. На правила алгебры TI не ссылалась. Затем в следующих калькуляторах это решение откатили. В рунете повышение приоритета приписали некой алгебраичности калькулятора. Обосновывают тем пособием и ещё одним, противоречащим ему (пофиг, пляшем).

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

И подкину на эту тему:

  • На письме можно не дотянуть до конца черту корня: √ax, пусть гадают.

  • 3*10^6 - это форма записи одного числа (то же, что 3e6) или выражение из нескольких чисел? От этого зависит результат выражения 1/3*10^6. Wolfram Alpha считает одним числом (но не с пробелами: 3 * 10^6), при обсуждении предыдущей статьи на это наткнулся.

В одних калькуляторах Texas Instruments решили повысить приоритет неявного умножения

Я тоже так делал. А ещё ввёл оператор умножения с приоритетом ниже сложения, и с 2-мя дополнительными операторами делениями аналогично. Всё это для того, чтобы аргументы функции без скобочек писать можно было. Но вот операция возведения в степень ^ в эту стройную систему уже не вписалась, увы.

Имхо, человек - не робот, и мне запись a ÷ bc = a÷(b*c) кажется логичной. Но a ÷ b*c воспринимается как что-то отдельное. Хотя даже здесь, признаюсь, глазами b*c выглядит как целое, без скобок. Нам (людям) договориться бы один раз и всё.

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

Но в этих книжках же не писали, что этим простым калькулятором потом будет пользоваться кто-то еще.

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

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

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

Эти калькуляторы из примеров или могут выполнять только по одному действию за раз, или полагаются на имеющийся в ЯП оператор eval или его аналог

Фигнёй какой-то занимались все эти люди. Какое такое π? Пользователь не вводит на калькуляторе π, он вводит некие цифры. Вот сколько он их ввёл, с этим числом и будут выполняться вычисления. А вовсе не с числом π.

Пользователь может ввести именно pi, специальной кнопкой. А не набирать 3,141592...

Да, конечная. Но вы в курсе накапливаемой ошибки? Так что для констант, чтобы минизировать эту самую ошибку, точность должна быть весьма большой. А пи и е слишком часто встречающиеся константы при инженерных вычислениях.

Значит надо взять на две цифры больше, чем требуется в результате. Собственно, так и построены все калькуляторы - у них обычно не меньше 6 цифр. А в инженерных расчётах требуется не больше трёх - да, представьте себе! 0.1% - такую точность обычно имеют хорошие измерительные приборы. Для особо точных может потребоваться четыре цифры. Вот поэтому шести цифр на калькуляторе за глаза хватает для любых расчётов. И поэтому данная статья - не более чем словоблудие!

Значит надо взять на две цифры больше, чем требуется в результате.

Рекомендуем таки прочитать статью.

Потому что именно сколько требуется в результате - там не фиксировано ни с написания кода калькулятора, ни даже с начала задания аргументов для расчёта.

0.1% на самом деле не такая уж и большая точность

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

Ближайший пример - расчет процентов по вкладу или налогам. 0.1% это вообще днище, а не точность. И это то, с чем сталкивается почти каждый человек. Пи в этом не участвует, но это такой маркер как разработчик вообще относится к точности расчетов.

Но никто нормальный не делает эти рассчеты в телефоне. Мы ведь все еще встроенный калькулятор андроид обсуждаем?

Если все будут забивать на такую простейшую вещь, как калькулятор, то какое же впечатление должно будет сложиться о более сложных программах? Калькулятор должен считать любые вещи и делать это правильно. А не выдавать отмазки в духе: ой, купите DLC извините, вам это не надо, покупайте профессиональный инструмент, чтобы умножить ПИ на гугол.

А если оказывается, что на самом деле написать калькулятор не так то и просто, то что вы предлагаете? Чтобы что-то нормальное написал студент между прогулами пар?

И очень хорошо, что встроенный калькулятор вычисляет нормально, а не требуется ставить еще чего-то на 100 Мб, чтобы умножение работало

Извините, не вижу логики. Инструмент выбирается под задачу. Замените калькулятор на другое что-то в своейм утверждении и посмотрите.

Типа "если все пишут сапер тяп ляп, о что же с остальными играми?"

В статье же дан ответ на этот вопрос: зависит от конкретного выражения. sin(πn) даст в ответе точный ноль - в данном конкретном случае π фактически имеет бесконечную точность. А если считать π+e, например, то точность будет конечная.

Вы хотите сказать, что точность может превышать размерность разрядов, в которых число храниться?
Условно если под хранение Pi выделено 32 бита память, он в любом случае будет иметь точность не больше, чем +-100/(2^33)%
Даже если там применяется арифметика с плавающей запятой

Эх, если бы вы всё-таки прочитали статью, вы бы не задавали сейчас этот вопрос...

Так у них π хранится в виде функции. Поэтому и точность у него любая заданная

У вас телефон - андроид? Если да, то запустите там калькулятор, нажмите на кнопку Пи, он вам покажет начало этого числа. Начните его листать скролля пальцем справа налево, когда долистаете до конца, скажете нам, какая там конечная точность :)

Вероятно производитель вашего телефона предустановил какой-то другой калькулятор вместо гугловского. У дочки Моторола moto g, у жены Гугл пиксель 7, на обоих в калькуляторе скроллится бесконечно, доскроллил до 1000+ знака за несколько секунд.

А если например умножить на 10 000 000 000? Разные калькуляторы по разному себя ведут

MATE Calculator из убунты
MATE Calculator из убунты

Они его на ходу вычисляют или из инета тянут? :)

Именно это я и хочу сказать. Числа можно представлять разными способами. Возьмём число 0.1 - у вас же нет сомнений, что я смог абсолютно точно записал это число? А в двоичном представлении записать точно его невозможно. Но двоичное представление не является единственно возможным. Даже внутри компьютера вы можете, применив мозги, хранить не только двоичные числа. Именно об этом и написана статья.

Зависит от реализации. Можно забить константу, а можно считать с потребной точностью. Об этом, собственно, и статья.

Технически можно впихнуть её не в виде данных, а в виде алгоритма, который бесконечно наращивает её точность. т. е. нажал равно — результат появился и начинает бесконечно уточняться, прямо на экране. Чем дольше ждёшь, тем точнее результат. И так можно не с π, а вообще со всеми числами — выражение сначала упрощается, а затем итеративно вычисляется, наращивая точность, до бесконечности.

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

Никак не могу понять, для чего это нужно? Для чего может быть нужна точность π больше двух знаков после запятой? Если у калькулятора 6 разрядов, а в ответе все нули, а в седьмом — 1, то какая разница? Просто если первые 6 — нули, то выводить не "0.00000", а "0". Ну то есть как чисто теоретически интересная задача — написать идеальный калькулятор — я понимаю, а практически — для чего?

интересная задача

This.

Вообще π может быть нужно с точностью больше 2 знаков, если мы делаем какую‑нибудь прецензионную втулку из рубина, у которой должна быть точность 1 атом. Да даже в пластины жестких дисков делаются с такой точностью, что двух знаков π явно мало, чтобы, например, рассчитать положение головки в полярных координатах.

Калькулятор, который «абсолютно точный и не косячит, гарантия 100%» может быть действительно полезным, но далеко, далеко не всегда в этом есть необходимость. Но это не значит, что её вовсе нет.

Кроме того, сам факт изучения вопроса «как сделать это очень точным» генерирует полезные знания и разные приёмы, которые могут помочь в тех местах, где практически нужно повысить точность или оптимизировать вычисления.

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

Ок, насчёт винчестеров и т. п. — согласен. Но нужно ли это для калькулятора в ширпотребном устройстве за 15к рублей...

Пи - это маленькая часть вычислений вообще, просто маркер отношения разработчиков к тому, что делает их программа. А в маленьком устройстве нормальные вычисления еще более актуальны, потому что в профессиональном профессионалы скорее всего будут нормально считать, считаясь с техническими ограничениями, а вот любительские примеры легко уйдут в середине в какой-нибудь overflow, хотя итог мог бы быть вполне валиден.

если мы делаем какую‑нибудь прецензионную втулку из рубина, у которой должна быть точность 1 атом

И считаем это на телефоне... то...

Что? Современный телефон чем‑то менее точен компьютера?

Да просто никто не считает это так. САПРы всякие умные люди не для того пишут чтобы ты руками в калькулятор тыкался.

Для чего может быть нужна точность π больше двух знаков после запятой?

Чтобы после десяти действий накопленная ошибка округления всё ещё позволяла отличить эллипс от гиперболы.

Для чего может быть нужна точность π больше двух знаков после запятой?

Например, для траекторных вычислений космического аппарата в миссии на спутник Юпитера.

Я думаю имеется ввиду вычисления на калькуляторе. Безусловно есть сферы, где высокоточные вычисления в том числе π нужны. Но не в рамках же калькулятора.

Представьте, что у вас в ответе на задачу возникла разность вида (π-3.14). Как вы думаете, 0 и 0.00159265... - это разные числа? Вам бы хотелось их отличать друг от друга?

Ну так очевидно же, что кому то нужна кому то нет

И для этого создаётся настройка, мол с какой точностью считать, и никакого гемора)

У Гугловского калькулятора есть режим инженерного калькулятора. И пользователь (я, например) не просто может ввести число π, он это регулярно делает. Зачем кому-то может понадобиться вводить вместо π некие цифры? Это и требует больше нажатий, и даёт заведомо неверный результат.

Нажатие кнопки π приводит лишь к тому, что это конечное число цифр вводится калькулятором. Но оно от этого не перестаёт быть конечным.

Нет, в андроид калькуляторе число Пи (как и другие иррациональные числа) можно листать бесконечно, оно будет дорассчитываться налету.

Не совсем так. Попробуйте в Samsung умножить Пи на 1000000000 - удивитесь.

А вы не пробовали прочитать и понять статью, под которой вы комментарии оставляете? Или ваше изучение математики в школе остановилось в 6 классе?

Еще когда читал статью в оригинале, задумался над вопросм "А зачем это нужно было гуглу?". В чем смысл стрелять из пушки по воробьям, тратя дорогущее время топового специалиста (который потом вовлек еще двоих такого же уровня) на калькулятор, который 99% пользователей используют чтобы поделить чек в кафе?
Ну, допустим, есть еще школьники с чуть более сложными вычислениями. Но все равно кажется, что описанное выше - это чудовищный оверкилл.

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

Это само собой! С точки зрения примера как основательно человек решал задачу, история максимально впечатляющая.

Есть два вида чудовищного оверкила:

  • Потратить очень много времени очень компетентного специалиста на написание идеального кода.

  • Потратить очень мало времени очень малокомпетентного специалиста и с помощью переиспользования кода быстро получить "рабочее" решение.

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

Я, конечно, сильно упрощаю и с точки зрения бизнеса, наверняка, очень не прав. Но первый оверкил как-то симпатичнее.

Согласен, симпатичнее. Но между этими оверкиллами есть и промежуточные решения.

У меня вообще нет никаких вопросов к Бёму. Наверняка он получил кучу фана от процесса. Я, возможно, тоже на его месте так закопался бы (если бы умел делать это так же круто, как он).

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

Скорее всего, его условным менеджером был кто-то из высшего руководства Гугла, и обосновывал эти затраты он перед собой :)

Промежуточных решений не бывает. Бывают решения, удовлетворяющие ТЗ, и не удовлетворяющие. А вот ТЗ уже могут быть сформулированы "промежуточно".

Что касается Бёма, то он занимался проблемой "калькулятора" задолго до прихода в Гугл, еще будучи сотрудником SGI (а затем HPE).

Constructive Reals Calculator
Constructive Real Arithmetic

Together with Corky Cartwright, Vernon Lee, and others, I explored practical implementations of "exact" real computer arithmetic. Numbers are represented exactly internal to the computer, in a form that allows evaluation to any requested precision for display. This resulted in several papers and a sequence of implementations, including a Java one. It served as the basis of the more recent work on arithmetic in Google's Android calculator.



Хотелось бы узнать, конечно, откуда ноги растут, но, возможно, это был его пет-проект, доведенный до ума в гугле.

Отцы-основатели Брин с Пэйджем -- математики в поколеньях, так что в давние времена империи добра оно было естественно. Ну или может их собственные финансы исчисляются с использованием той же библиотеки? Гугола денег у гугла, наверно, пока еще не предвидится, но когда считаешь свои деньги, даже одна мысль о принципиальной неточности гложет.

Ну или может их собственные финансы исчисляются с использованием той же библиотеки?

Возможно, им просто нужно было как-то считать долг перед российскими телеканалами )))

ИМХО, это вполне оправдано, с учетом того, что андроид имеет миллиарды пользователей. Если представить, что всего 1% пользователей считает на нём что-то сложнее, чем базовые операции, то 1% от миллиарда - это уже 10 млн людей.

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

Это в сущности не сильно сложнее, чем заметка, это описывающая. В прочем, можно ещё куда проще - символьная оптимизация дерева вычислений (любое a x n + a x m равно a x (n+m) , при этом a мы считаем символом и даже не вычисляем, a^n/a^m = a^(n-m), и набор подобных правил) и трактовка последнего разряда любого вычисленного числа, как фантомного (любое x.000000000n равно x). Никто бы не придрался, если использовать 80 bit float. Контрпример можно придумать, но сложно и не особо нужно.

Но все равно кажется, что описанное выше - это чудовищный оверкилл.

Это самый распространённый калькулятор на планете. Фактически любая ошибка в нём будет гадить десяткам тысяч людей.

Если смотреть с точки зрения корпорации и прибыли - вы правы. Если смотреть с точки зрения "пользы для людей", это правильное применение сил, главное потом этот калькулятор не менять. :-)

Это самый распространённый калькулятор на планете. Фактически любая ошибка в нём будет гадить десяткам тысяч людей.

Программист, нарисовавший интерфейс калькулятора для Win10: ваще пофиг.

Скрытый текст

Вклад 1) в общее впечатление от гугла и андроида, 2) в мировую математику. Создание впечатления у тех, кто немного больше понимает, и тем самым хотя бы лёгкое склонение их на свою сторону.

Вот-вот. И это та компания, которая на собеседовании задаёт специально вымученные вопросы про блендер, чтобы убедиться, что кандидат не будет делать over-thinking.

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

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

задумался над вопросм "А зачем это нужно было гуглу?"

Потому что гугл нанимает лучших профессионалов, а они [иногда] любят делать лучшее возможное решение.

Добавлю /поправлю.

Конструктивные числа на самом деле это видимо вычислимые числа. См. википедию

https://ru.wikipedia.org/wiki/Вычислимое_число

Статья хилая, лучше смотреть английскую версию: https://en.wikipedia.org/wiki/Computable_number

А еще лучше книгу "Верещагин Н. К., Шень А. — Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции — М.: МЦНМО, 1999 "

Поучительное чтение, но требует некоторых мозговых усилий.

P.S. Скачал из интернета, но там не хватает по крайней мере нескольких страниц в начале. Может печатная книга лучше? Не знаю.
P.P.S. Похоже я ошибся. Но есть еще издание 2008, лучше наверное его почитать.

Как-то так получилось что у меня установлено три приложения калькулятора для Linux - все три не сговариваясь дали правильный ответ на это (10^100) + 1 - (10^100)

Ну если решение Бёма обнародовано, то уж кто-кто, а OS решения его точно у себя имплементируют.

SpeedCrunch выдаёт неправильный ответ.

Возможно, внутри этого калькулятора используется длинная арифметика, которая ограничена 50-ю десятичными цифрами.

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

А в чём разница этих нотаций?

Если там есть какая-то ошибка, то сверху может быть побитовый xor. Так под прошлым постом два раза в джаваскрипте делали.

Надеюсь, теперь вы больше будете ценить калькулятор в Android!

А вот что интересно. Ни в Android ни в iOS - не смогли сделать такую полезную штуку - как повтор последней операции при повторном нажатии на "=". А ведь часто такое нужно в быту, гораздо чаще чем супер-точность. А MS - смогли это сделать, молодцы.

Причем сделать это не так уж тривиально на самом деле.

У меня в Самсунге S21+ вполне повторяет во встроенном калькуляторе. Но, возможно, он не ванильный Андроидный...

А как советский инженерный калькулятор считал и синусы и экспоненты в те годы, когда ещё не придумали IEEE для плавающей запятой?

Форматы с плавающей запятой придумали сильно раньше, чем один из них был закреплён стандартом IEEE. И они были разные.

Вот вам исторический список только форматов представления плавучки: http://www.quadibloc.com/comp/cp0201.htm. Зацените разнообразие подходов и размеров.

А ещё есть вопросы требований к вычислениям. IEEE754 требует для арифметики и рекомендует для функций - округление после как бы бесконечно точного результата. (На самом деле 1-2 младших бита, ULP, постоянно страдают - вот свежак про это. Но это таки начиная с sin() и для более сложных функций.) А раньше на это заметно поплёвывали.

S/360, S/370, и их аналоги ЕС-10xx в родной плавучке (в современных доках она зовётся HFP, hexadecimal floating point) вообще усекали все числа в операциях, а сама HFP прыжками по 4 бита вместо 1 ещё больше портила. При переходе на них с 7090, 7094 стояли плач и скрежет зубовный. И ничего, на этом производились серьёзные расчёты... надо было, конечно, чуть серьёзнее учитывать погрешности операций, чем сейчас. В 1968-м был массовый отзыв на переделку, потому что в двойной точности не было вообще guard digit, и на вычитаниях с умножениями точность была неприлично низкой - IBM модернизировала все блоки. PDP-11 имела 2 защитных бита там, где надо 3, неуправляемое округление, не имела INF. Мы-то уже видим готовенькое, но научная и инженерная мысль тут развивалась чудовищно медленно.

Те, кто профессионально занимаются вычислительной математикой всех видов, по крайней мере знают (их учили) про основные риски и методы их преодоления. Но тема неисчерпаема...

Можете подсказать. Не нашел приведенной книги на русском, на английском боюсь не осилю. А в целом, как человеку, изучавшего математику только в школе, можете посоветовать хорошие книги, по которым можно было бы углубиться в эту тему. Возможно для начала что-то по проще. А то я даже не знаю с чего начать

Кроме двух иррациональных констант ( пи и е ) есть еще Фи или Золотая Пропорция. Как его выразить на таком калькуляторе ? Надо еще одну кнопку добавить.

Это они изобретали велосипед, чтобы на мобилках работало быстро? Раз дали пользователю возможность вводить подобные выражения, то почему их не считать давно написанными и протестированными библиотеками символьных вычислений?

А где такие библиотеки берут? Я символьные вычисления видел только в виде специализированых языков и систем, типа Wolfram, а не как библиотеки для jvm или еще чего-нибудь.

2*pi + 3*sqrt(2), допустим, представляются в таком виде. Но я не догнал, как они смогут представить pi^pi, если там везде только произведение "хорошего" числа на "плохое". Что-то я, видимо, не понимаю.

Вероятно, экспонента от логарифма или наоборот

ну как бы 10^18 в кубе слишком большое число для калькулятора, наверное

Проблема не в размере числа, а в том, сколько знаков нужно вычислить чтобы показать результат. 10^18^3 легко.

О!!! Я такое писал!
На 8-битном компутере. Пришлось писать СИМВОЛЬНЫЙ интерпретатор :D

А есть реализации этого в виде библиотеки?

Пошёл переписывать тестовые задания для кандидатов...
Теперь на позиции синьора и выше - пишем калькулятор
Для джунов, что нибудь простенькое, типа своей реализации quiksort...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории