Ну вот, например, как это может выглядеть:
me@my:~/calcu$ ./calcu
> 2+2
4
> fact(2+2)
24
> fact(fact(2+2))
620448401733239439360000
> fact(5)
120
> fact(fact(5))
6.689502913449127057588118054090372586752746333138029810295671352301621E+198
> accu = 200
> fact(fact(5))
6689502913449127057588118054090372586752746333138029810295671352301633557244962989366874165271984981308157637893214090552534408589408121859898481114389650005964960521256960000000000000000000000000000
> quit
me@my:~/calcu$
Правда, не на баше, зато он сам парсит все выражения. И точность может быть любая*), только ее надо указывать явно перед вычислением выражения.
-----------------------------------------------------------------------------------------------------
*) Любая, но возможно не более 999999999 цифр. Существует также техническое ограничение, связанное с объемом доступной памяти.