-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrational_numbers.sh
More file actions
34 lines (31 loc) · 1.11 KB
/
Copy pathrational_numbers.sh
File metadata and controls
34 lines (31 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env bash
IFS=$'/' read -r op1_1 op1_2 <<< "$2"
IFS=$'/' read -r op2_1 op2_2 <<< "$3"
low() {
local dividend=$1
local divisor=$2
local left=1
while (( left != 0 )); do
(( left=dividend%divisor ))
dividend=$divisor
divisor=$left
done
(($2/dividend > 0 )) && echo $(($1/dividend))/$(($2/dividend)) || echo $((-1*$1/dividend))/$((-1*$2/dividend))
}
case $1 in
"+") op1=$(( op1_1*op2_2 + op2_1*op1_2 ))
op2=$(( op1_2*op2_2 ))
low op1 op2 ;;
"-") op1=$(( op1_1*op2_2 - op2_1*op1_2 )); op2=$(( op1_2*op2_2 )); low op1 op2 ;;
"*") low $((op1_1*op2_1)) $((op1_2*op2_2)) ;;
"/") low $((op1_1*op2_2)) $((op1_2*op2_1)) ;;
abs) l=$(low "$op1_1" "$op1_2"); echo "${l#-}" ;;
pow) if (( op2_1 < 0 )); then
low $((op1_2**${op2_1#-})) $((op1_1**${op2_1#-}))
else
low $((op1_1**op2_1)) $((op1_2**op2_1))
fi ;;
rpow) ret=$( awk 'BEGIN { print ARGV[1]**(ARGV[2]/ARGV[3])}' "$2" "$op2_1" "$op2_2" );
[[ $ret =~ [.,] ]] && echo "$ret" || echo "${ret}".0 ;;
reduce) low "$op1_1" "$op1_2" ;;
esac