функции bash bcmath - PullRequest
       6

функции bash bcmath

2 голосов
/ 28 апреля 2010

У меня есть две функции для GNU bc в скрипте Bash.

BC_CEIL="define ceil(x) { if (x>0) { if (x%1>0) return x+(1-(x%1)) else return x } else return -1*floor(-1*x) }\n"
BC_FLOOR="define floor(x) { if (x>0) return x-(x%1) else return -1*ceil(-1*x) }\n"
echo -e "scale=2"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc

Обе функции прекрасно работают в интерактивном режиме. bc не позволяет использовать несколько функций в одной строке, разделенных; хотя, так что я должен повторить -n | bc с символами новой строки в конце каждой функции. Вышеуказанный вывод равен 2.5, а не ожидаемый 3.0, который я получу, если сам наберу его в bc -i. Кажется, что bash вызывает bc для каждой строки вывода эха, а не выводит все это в один экземпляр. Есть ли обходной путь для этого?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Я считаю, 1. неверно. if() сравнение должно быть X >= 0.

Я нахожу это работает

define ceil(x) {                         
    if (x >= 0) { if (x%1>0) return x+(1-(x%1)) else return x } 
    else return -1*floor(-1*x)               
}
define floor(x) {                        
    if (x >= 0) return x-(x%1)               
    else return -1*ceil(-1*x)                
}
2 голосов
/ 28 апреля 2010

Шкала должна быть нулевой, чтобы x%1 работал. Обычно у вас должен быть только один возврат из функции.

define ceil(x) { auto savescale; savescale = scale; scale = 0; if (x>0) { if (x%1>0) result = x+(1-(x%1)) else result = x } else result = -1*floor(-1*x);  scale = savescale; return result }
define floor(x) { auto savescale; savescale = scale; scale = 0; if (x>0) result = x-(x%1) else result = -1*ceil(-1*x);  scale = savescale; return result }

Для этого требуется новая строка после оператора масштаба:

echo -e "scale=2\n"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc
...