LINUX.ORG.RU

BASH и операции с нецелыми числами.


0

0

В скрипте необходимы операции с нецелыми числами. Нашёл пока только два варианта решения этого вопроса: 1) С помощью bc - Но у меня на работе bc урезанный и с ним выполнить задачу не получится. 2) С помощью awk - Занимает много времени на при большом числе операций. Сравнение: check=`echo "$a $b" | awk '{if ($1 >= $2) print 1; else print 0}'` Сложение или вычитание: c=`echo "$b $c" | awk '{print $1 - $2}'`

Может есть другие варианты?

Ответ на: комментарий от true_admin

Не имею возможности по причинам, от меня не зависящих. ((

Naruto-kun
() автор топика

> С помощью awk - Занимает много времени на при большом числе операций.

1 вариант: обрабатывай сразу большими пачками.

2 вариант: держи awk постоянно сопроцессом в бэкграунде и общайся с ним по пайпам.

dilmah ★★★★★
()

>Но у меня на работе bc урезанный

Это как? Не умеет работать с нецелыми числами что ли?

fizteh
()
Ответ на: комментарий от dilmah

>>Занимает много времени на при большом числе операций.
Ого. High perfomance bash scripting? Реквестую ассемблерные вставки!

А что там есть, на target системе? Может, питон?

ratatosk
()

> Занимает много времени на при большом числе операций.

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

Deleted
()
Ответ на: комментарий от sf

лучше если это будет не скрипт :)

Топикстартеру: если у тебя задача чисто одно поделить на другое то напиши простейшую прогу на сях. На целевой платформе fpu вообще есть? :)

true_admin ★★★★★
()

> С помощью bc - Но у меня на работе bc урезанный и с ним выполнить задачу не получится.

Что за задача и что за версия bc?

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

const86 ★★★★★
()

на досуге я люблю считать на шелле числа фиббоначи

echo 0010011 | sed 's/\(.\)/\1@/g' | tr @ \\n | awk -v c='1 0 1' -v m='0 1 1' '{ split(m,a); split(c,b) } $1>0 { $1="(" b[1] "*" a[1] "+" b[2] "*" a[2] ")"; $2="(" b[1] "*" a[2] "+" b[2] "*" a[3] ")"; $3="(" b[2] "*" a[2] "+" b[3] "*" a[3] ")"; c=$0 } { $1="(" a[1] "*" a[1] "+" a[2] "*" a[2] ")"; $2="(" a[1] "+" a[3] ")*" a[2]; $3="(" a[2] "*" a[2] "+" a[3] "*" a[3] ")"; m=$0 } END { split(c,b); print b[2] }' | bc

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

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> на досуге я люблю считать на шелле числа фиббоначи

Привет, брат по маразму :)

const86 ★★★★★
()

>А что там есть, на target системе? Может, питон?

Питона нет.

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

>Лучше такой скрипт писать не на shell.

Как я уже сказал, чтобы не было в системе необходимо использование только bash. Если бы можно было написать на том же самом си или ещё, что-то другое, вопрос бы и не задавал.

>Топикстартеру: если у тебя задача чисто одно поделить на другое то напиши простейшую прогу на сях. На целевой платформе fpu вообще есть?

Есть.

>Но у меня на работе bc урезанный >>Это как? Не умеет работать с нецелыми числами что ли?

Сравнение тоже самое вообще любых чисел он не делает. Выдаёт ошибку: syntax error on line 1, teletype на такую, например команду: echo "1.2>1.1" | bc . В тоже время тестил bc дома, теже команды он выполняет на ура. Единственное, что получилось заставить работать на работе, это awk, как я уже писал выше.

> Пробовал bc -l ?

Пробовал, всё равно ошибку выдаёт.

Naruto-kun
() автор топика
Ответ на: комментарий от Naruto-kun

реквестую бинарник bc! и да, мон к той реализации bc прилагается?

Giver
()
Ответ на: комментарий от Naruto-kun

# echo "1.2>1.1" | bc
1
# echo "1.2>1.1" | bc -s
(standard_in) 2: Error: comparison in expression
# echo "if (1.2>1.1) 1" | bc -s
1

# bc --version
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.


Найди десять отличий.

AnDoR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.