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

Хозяйке на заметку: изготовить мощный научный калькулятор можно всего одной строчкой кода для 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

field_vote: 
Ваша оценка: Нет Средняя: 4.3 (6 оценки)
Языки программирования: 

Комментарии

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

Оценка: 
Средняя: 3 (4 оценки)

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

Оценка: 
Средняя: 5 (7 оценки)
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 оценка)

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

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

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

Оценка: 
Пока без оценки
comrade аватар

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

Оценка: 
Пока без оценки

В регистр процессора вы как 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
Что-то типа...:-)

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

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

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

И т.д., и т.п.

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

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки

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

Оценка: 
Средняя: 1 (1 оценка)

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

Оценка: 
Средняя: 5 (1 оценка)

Так же правильно посчитал 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» –
интерактивный алгебраический язык с числами произвольной длины.

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки

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

Оценка: 
Пока без оценки
comrade аватар

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

Оценка: 
Средняя: 4 (1 оценка)

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


include Math
(sin(PI / 6) * cos(PI / 6)) ** 2 + sqrt(2.0/3)

Оценка: 
Средняя: 5 (3 оценки)
comrade аватар

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

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

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

Оценка: 
Пока без оценки

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

Оценка: 
Средняя: 5 (2 оценки)

Комментировать

Filtered HTML

  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <strike> <code> <h2> <h3> <h4> <h5> <del> <img>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.