mirror of
https://dicksdeathabove.xyz/~mia/psh-fractional
synced 2024-09-19 08:29:09 +00:00
53 lines
1.7 KiB
Bash
Executable file
53 lines
1.7 KiB
Bash
Executable file
#!/bin/sh
|
|
# add $2 to $1 and return
|
|
[ -z "${1##*.*}" -o -z "${2##*.*}" ] && { # if float # dylanaraps/pure-sh-bible#check-if-a-number-is-a-float
|
|
# modified to check $1 & $2
|
|
if [ ! -z "${1##*.*}" ]; then
|
|
set -- "${1}.0" "$2"; d="${1#*.}"; d2="${2#*.}"
|
|
until [ "${#d}" -eq "${#d2}" ]; do
|
|
set -- "${1}0" "$2"
|
|
d="${1#*.}"
|
|
done
|
|
elif [ ! -z "${2##*.*}" ]; then
|
|
set -- "$1" "${2}.0"; d="${2#*.}"; d2="${1#*.}"
|
|
until [ "${#d}" -eq "${#d2}" ]; do
|
|
set -- "$1" "${2}0"
|
|
d="${2#*.}"
|
|
done
|
|
fi # if $1/$2 is not a float; convert to float
|
|
until [ "${#1}" -ge "${#2}" ]; do
|
|
set -- "0$1" "$2"
|
|
done
|
|
until [ "${#2}" -ge "${#1}" ]; do
|
|
set -- "$1" "0$2"
|
|
done
|
|
#echo "$1 $2"
|
|
f1="${1##*.}"; f2="${2##*.}" # whole is ${1%.$f1} # dot required
|
|
# eq is $1+$2 -- $f1 + $f2 -- then add $1 & $2
|
|
w1="${1%.$f1}"; w2="${2%.$f2}"
|
|
until [ "${w1#0}" = "$w1" ]; do
|
|
w1="${w1#0}"
|
|
done
|
|
until [ "${w2#0}" = "$w2" ]; do
|
|
w2="${w2#0}"
|
|
done # dash has issues when numbers have leading 0's
|
|
# zsh,bash,etc don't need this at all
|
|
wo="$((${w1#0}+${w2#0}))" # whole digit, this is preset and not redeclared
|
|
# this is because we may need to carry
|
|
while [ "$f1" ]; do
|
|
while [ "$f2" ]; do
|
|
next2="${f2#?}"; next1="${f1#?}"
|
|
[ "$((${f1%$next1} + ${f2%$next2}))" -gt 9 ] && {
|
|
oo="$o"; [ "$o" ] && {
|
|
: $((oo+=1))
|
|
} || : $((wo+=1))
|
|
o="$((${f1%$next1} + ${f2%$next2}))"; o="${o#?}"; o="$oo$o"; unset oo # unset to save ram
|
|
} || o="$o$((${f1%$next1} + ${f2%$next2}))"
|
|
f2="$next2"; f1="${next1}"
|
|
done
|
|
done
|
|
echo "$wo.${o:-0}"
|
|
} || { # if not just do basic addition
|
|
echo $(($1+$2))
|
|
}
|