Продвинутый научный калькулятор своими руками

Хозяйке на заметку: изготовить мощный научный калькулятор можно всего одной строчкой кода для Bash.

Калькулятор в Linux

Откройте файл .bashrc в своей домашней директории и внесите в него следующую строку:

alias calc='python3 -ic "from math import *"'

Перезапустите терминал. Для вызова калькулятора наберите calc.

calc
>>> x = ( sin(pi/6)*cos(pi/6) )**2 + sqrt(2/3)  
>>> x 
1.003996580927726
>>> x+x
2.007993161855452
>>> log10(x+x*5)
0.7798834842217774

Преимущества калькулятора:

  • интуитивная очевидность синтаксиса;
  • все основные математические функции;
  • функциональность можно расширять практически неограниченно с помощью import;
  • отличный справочник по функциям.

Мало? А что бы вы сказали, если бы была возможность совместить калькулятор с MatLab? Волшебство Linux-технологий позволяет и такое:

apt-get install ipython python-matplotlib

В .bashrc:

alias calc='ipython --pylab'

Теперь возможности «калькулятора» безграничны.

MatLab в Linux

Ваша оценка: Нет Средняя оценка: 4.2 (5 votes)

Лучше сделайте обзор графических калькуляторов.

Ваша оценка: Нет Средняя оценка: 3 (4 votes)

гы
а потом сделай так:
calc
>>> 0.1+0.1+0.1-0.3
и насладись результатом
5.551115123125783e-17
>>>

Ваша оценка: Нет Средняя оценка: 5 (6 votes)
comrade

Проверил мою маленькую коллекцию линуксовских калькуляторов.
"0" получился у
Genius Mathematical Tool,
SpeedCrunch,
Qalculate!,
Gcalctool.
Так же правильно посчитал bash:

echo 0.1+0.1+0.1-0.3|bc -l

0
LibreOffice Calc – тоже "0"

Других мнений (причём, разных:-) придерживаются
galculator,
GRPN,
extcalc,
MTAC.

Ваша оценка: Нет Средняя оценка: 5 (1 vote)
pomodor

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

irb(main):001:0> 0.2+0.1
=> 0.30000000000000004

И это ожидаемый для программиста ответ.

Ваша оценка: Нет
comrade

Вероятно, грамотные калькуляторы просто не делают из дроби 1/10 число с плавающей запятой :-)

Ваша оценка: Нет
pomodor

Делают. Как иначе можно в процессор запихнуть 1/10? Только перед выводом калькулятор скорректирует ответ, чтобы пользователь не охренел от неожиданности. А ЯП не скорректирует, так как ожидается, что уж программист-то должен понимать, откуда берется этот результат.

Ваша оценка: Нет
comrade

По-простому, можно – как во втором классе.
1/10 + 1/10 = (1 + 1)/10 = 2/10
(и никаких вещественных чисел, дробь – это два целых числа:-)
А в более сложных случаях есть всякие прикольные штуки, типа цепных дробей и прочего.
Вычисления с абсолютной точностью – это отдельный раздел вычислительной математики.

Ваша оценка: Нет
pomodor

В регистр процессора вы как 1/10 засунете? В целочисленный это не влезет, а FP-регистр может терять несколько последних бит при определенных обстоятельствах, описанных в статье по ссылке выше.

Ваша оценка: Нет
comrade

2/7 + 3/5 =
= 2*5/7*5 + 3*7/5*7 =
= 10/35 + 21/35 =
= (10+21)/35 =
= 31/35
Что-то типа...:-)

Ваша оценка: Нет
pomodor

Думаю, мне не нужно напоминать, что сия конструкция сразу нае...нётся, как только промежуточным результатом вычислений окажется иррациональное число? ;)

Ваша оценка: Нет
comrade

Ну, в вещественном регистре иррациональное число тоже будет себя чувствовать, как рыба об лёд:-)

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

Ваша оценка: Нет
pomodor

Правильно. Теперь возвращаемся к вашему высказыванию: "грамотные калькуляторы просто не делают из дроби 1/10 число с плавающей запятой".

Ваша оценка: Нет
comrade

Не вижу предмета для спора. Эту задачу можно решать и через целые числа, и через вещественные (используя дополнительный контроль точности).
Это достаточно очевидно.

Ваша оценка: Нет
pomodor

Напомню тогда о предмете. Вы сказали: "грамотные калькуляторы просто не делают из дроби 1/10 число с плавающей запятой". Готов поспорить. Мое мнение: грамотные калькуляторы любые числа хранят в FP-регистрах. Даже результат вычисления 1+1. Просто потому, что следующей операцией может быть извлечение квадратного корня, например.

Ваша оценка: Нет
comrade

Вообще-то операция в процессоре по вычислению корня от вещественного числа – приближённая.

И "FP-регистра" для хранения чисел высокой точности не хватит (о чём Вы же в одном из комментариев ниже и написали:-). Так что число высокой точности хранится в целочисленных массивах, которые содержат мантиссу или порядок, либо числитель и знаменатель простой дроби, либо члены цепной дроби. В зависимости от реализуемых алгоритмов.

Иррациональные числа, как раз наиболее эффективно приближаются именно цепными дробями.

И т.д., и т.п.

В общем, мораль сей басни: простой калькулятор, который 0.1+0.1+0.1-0.3=[что-то там] – это действительно не сложно и очевидно.
А, при росте требований по точности и представлению результата, всякой интересной математики и алгоритмов задействуется всё больше.

Я не вижу смысла спорить – что там целое, а что вещественное.
С настоящими вещественными и иррациональными числами могут работать только системы компьютерной алгебры.

Ваша оценка: Нет
pomodor

Ну и культовая статья на эту тему: «What Every Computer Scientist Should Know About Floating-Point Arithmetic». Кстати, это один из вопросов, которые задают на собеседовании, чтобы сразу отфильтровать говнокодеров.

Ваша оценка: Нет

А вот в калькуляторе Windows такого нет! Значит, Windows лучше! Шах и мат, господа линуксоиды! :)

Ваша оценка: Нет Средняя оценка: 1 (1 vote)

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

Ваша оценка: Нет Средняя оценка: 5 (1 vote)
pomodor

Так же правильно посчитал bash:
echo 0.1+0.1+0.1-0.3|bc -l

А где здесь Bash? Это отдельная программа bc (An arbitrary precision calculator language) посчитала, а Bash только передал данные через конвейер.

Ваша оценка: Нет
comrade

Согласен!

Кстати, bc не просто "баш-калькулятор", а
«a language that supports arbitrary precision numbers with interactive execution of statements» –
интерактивный алгебраический язык с числами произвольной длины.

Ваша оценка: Нет
pomodor

bc — это не Bash Calculator. Это Basic Calculator. К слову, bc появился задолго до появления не только Bash, но и Linux.

Ваша оценка: Нет
comrade

Опять согласен:-)

А "числа произвольной длины" Вас не смутили?

Ваша оценка: Нет
pomodor

А почему меня должно было это смутить? Там есть внутренняя переменная scale, которой можно задать требуемую точность вычислений (цифр после запятой). И эта точность зависит только от объема ОЗУ на компе. Всё честно.

Ваша оценка: Нет

А extcalc кто-нибудь пробовал. Он есть в AUR.

Ваша оценка: Нет
comrade

Да, я его упоминал уже(-:
Extcalc:
0.1+0.1+0.1-0.3=-1.35525271560688054e-20

А так, интересный калькулятор (по возможностям), добавлен у меня в коллекцию.
Но мне не показался особенно удобным.
Да и его проект выглядит не особенно живым уже лет шесть.

Ваша оценка: Нет
Sunrise

Не проще ли использовать irb или встроенный функционал bash, например:
echo "$((14+17))"

Ваша оценка: Нет
dk

$(( )) не умеет нецелые числа. Тогда уж bc лучше, как уже предлагали выше

Ваша оценка: Нет
comrade

А как будет выглядеть пример из статьи
(sin(pi/6)*cos(pi/6) )**2 + sqrt(2/3)
на irb?

Ваша оценка: Нет Средняя оценка: 4 (1 vote)
pomodor

Только не на irb, а на Ruby. irb — название программы-интерпретатора (Interactive Ruby). Будет так:

include Math
(sin(PI / 6) * cos(PI / 6)) ** 2 + sqrt(2.0/3)
Ваша оценка: Нет Средняя оценка: 5 (3 votes)
comrade

...Что, конечно же, в разы проще чем вариант из статьи (-;

______________
Анекдот в тему (математический:-)

Вовочка принёс пару по математике.
Отец его ругает:
-Что на этот раз, дебил?!
-Ну, математичка спросила - "Сколько будет 3+2"
-А ты, дебил, не знаешь?!
-Я сказал - пять.
-Ну, правильно, и что?
-А она спросила - "А сколько будет 2+3"
-А это не один ху..?!
-Ну я так и сказал!

Ваша оценка: Нет
pomodor

Пардон, а куда еще проще? ИМХО, смысл не в том, чтобы сократить запись до курьезного минимума, а в том, чтобы освоенный синтаксис пригодился где-то еще. И очень хорошая идея в том, чтобы начать с «калькулятора», продолжить изучение языка и в итоге освоить программирование.

Ваша оценка: Нет Средняя оценка: 5 (2 votes)
Отправить комментарий
КАПЧА
Вы человек? Подсказка: зарегистрируйтесь, чтобы этот вопрос больше никогда не возникал. Кстати, анонимные ссылки запрещены.
CAPTCHA на основе изображений
Enter the characters shown in the image.