mirror of
https://dicksdeathabove.xyz/~mia/psh-fractional
synced 2024-11-08 13:54:26 +00:00
-- subtraction:
---- had issues due to an edge case before: ------ eg: 49518.81665 - 22399.4358 ------ produces: 47278.87307 ------ correct: 27119.38085 ---- this happened when ${#1} > ${#2} ---- if $2 contains decimals -- tester: ---- now exits `1` if answer is "false" -- division ---- debugging on going
This commit is contained in:
parent
e0cf732500
commit
0207f421f4
33
README
33
README
|
@ -2,22 +2,39 @@
|
||||||
psh-fractional
|
psh-fractional
|
||||||
-- fractional math in pure sh, successor to psh-float-micro
|
-- fractional math in pure sh, successor to psh-float-micro
|
||||||
---
|
---
|
||||||
Dev Status
|
|
||||||
-- this is on pause for now; I'm really tired
|
|
||||||
---
|
|
||||||
Current Status
|
Current Status
|
||||||
-- addition 100% working
|
-- addition ~85% working
|
||||||
|
---- has some odd issues with decimals
|
||||||
|
---- has issues with "Illegal number"
|
||||||
|
------ eg: 18471.81672 + 27540.27237
|
||||||
|
---- will debug at later date
|
||||||
-- subtraction ~90% working
|
-- subtraction ~90% working
|
||||||
---- decimal placement working now
|
---- had issues due to an edge case before: see last commit
|
||||||
---- some numbers produce the wrong results... no idea why
|
---- has an issue where $e in rad() somehow becomes malformed
|
||||||
|
------ eg: 23019.18605 - 1139
|
||||||
|
------ produces: 11629.18605
|
||||||
|
------ correct: 21880.18605
|
||||||
|
---- current method uses a system of removing the decimal from $1 & $2
|
||||||
|
---- and then subtracting them; (m1-m2)
|
||||||
|
---- the issue is likely in rad() as $((m1-m2)) is correct before
|
||||||
|
---- being handed to rad()
|
||||||
-- multiplication 100% working
|
-- multiplication 100% working
|
||||||
|
---- length issues when comparing to bc (produces additional decimals)
|
||||||
|
------ I am not going to attempt to fix this
|
||||||
|
------ it's really not an issue
|
||||||
-- division ~90% working
|
-- division ~90% working
|
||||||
---- may sometimes produce to many decimals
|
---- may sometimes produce to many decimals
|
||||||
|
------ this will not be fixed
|
||||||
---- rarely places decimals in wrong places
|
---- rarely places decimals in wrong places
|
||||||
|
------ eg: 324.81478 / 21715
|
||||||
|
------ produces: 1.49580833525212986414
|
||||||
|
------ correct: 0.01495808335252129864
|
||||||
|
---- Some odd edge case with $dp is causing this...
|
||||||
|
---- debugging ongoing
|
||||||
---
|
---
|
||||||
Outer Usage
|
Outer Usage
|
||||||
-- it is recommended to use this library with the upcomming
|
-- it is recommended to use this library with psh-fc
|
||||||
-- psh-fc if you wish to compare numbers that it produces
|
-- if you wish to compare numbers that it produces
|
||||||
-- as decimal numbers are not considered numbers by posix sh
|
-- as decimal numbers are not considered numbers by posix sh
|
||||||
---- https://dicksdeathabove.xyz/~mia/psh-fc
|
---- https://dicksdeathabove.xyz/~mia/psh-fc
|
||||||
---
|
---
|
||||||
|
|
|
@ -63,7 +63,7 @@ ld() { # $1/$2
|
||||||
esac
|
esac
|
||||||
#echo "$1 $2"
|
#echo "$1 $2"
|
||||||
di="$1"; div="$2"; count="$3" # redeclare
|
di="$1"; div="$2"; count="$3" # redeclare
|
||||||
#echo "$sp $div ${di}/${#di} | $1/$2 | $di/$div"
|
#echo "${sp# } $div ${di}/${#di} | $1/$2 | $di/$div"
|
||||||
o="$((${di%.*}/${div%.*}))"; [ "${#o}" -eq 0 ] && : $((count+=2)); : $((count+=${#o}))
|
o="$((${di%.*}/${div%.*}))"; [ "${#o}" -eq 0 ] && : $((count+=2)); : $((count+=${#o}))
|
||||||
sd="${di%.*}"; : $((count+=${#sd}));
|
sd="${di%.*}"; : $((count+=${#sd}));
|
||||||
until [ "${#di}" -eq "$((count+1))" ]; do
|
until [ "${#di}" -eq "$((count+1))" ]; do
|
||||||
|
@ -81,14 +81,17 @@ ld() { # $1/$2
|
||||||
fd="${sd}${fd}"
|
fd="${sd}${fd}"
|
||||||
#echo "$fd"
|
#echo "$fd"
|
||||||
}
|
}
|
||||||
sd="$((fd/div))"; [ "$sd" -eq 0 ] && : $((count+=1))
|
sd="$((fd/div))"
|
||||||
|
#[ "$sd" -eq 0 ] && : $((count+=1))
|
||||||
o="${o}${sd}"; sd="$((sd*div))"
|
o="${o}${sd}"; sd="$((sd*div))"
|
||||||
#printf " %s\n- %s\n" "$fd" "$sd"
|
#printf " %s\n- %s\n" "$fd" "$sd"
|
||||||
sd="$((fd-sd))"
|
sd="$((fd-sd))"
|
||||||
#echo "| $sd -- $i"
|
#echo "| $sd -- $i"
|
||||||
|
#echo "$o $dp"
|
||||||
di="${di#?}" # $fd$sd
|
di="${di#?}" # $fd$sd
|
||||||
: $((n+=1))
|
: $((n+=1))
|
||||||
done
|
done
|
||||||
|
#echo "$o"
|
||||||
n=0; sd="$o"; while [ "$sd" ]; do
|
n=0; sd="$o"; while [ "$sd" ]; do
|
||||||
next="${sd#?}"
|
next="${sd#?}"
|
||||||
[ "$n" -eq "$dp" ] && {
|
[ "$n" -eq "$dp" ] && {
|
||||||
|
@ -98,10 +101,10 @@ ld() { # $1/$2
|
||||||
sd="$next"
|
sd="$next"
|
||||||
: $((n+=1))
|
: $((n+=1))
|
||||||
done
|
done
|
||||||
|
#echo "-- $o"
|
||||||
#until [ "${o#0}" = "$o" ]; do
|
#until [ "${o#0}" = "$o" ]; do
|
||||||
# o="${o#0}"
|
# o="${o#0}"
|
||||||
#done
|
#done
|
||||||
#echo "$o"
|
|
||||||
if [ ! -z "${o##*.*}" -a "$dp" -gt 0 ]; then # missing decimal place
|
if [ ! -z "${o##*.*}" -a "$dp" -gt 0 ]; then # missing decimal place
|
||||||
do="$o"; [ "${#do}" -gt "$dp" ] && until [ "${#do}" -eq "$dp" ]; do
|
do="$o"; [ "${#do}" -gt "$dp" ] && until [ "${#do}" -eq "$dp" ]; do
|
||||||
do="${do%?}"
|
do="${do%?}"
|
||||||
|
|
|
@ -37,8 +37,8 @@ done
|
||||||
until [ "${m2#0}" = "$m2" ]; do
|
until [ "${m2#0}" = "$m2" ]; do
|
||||||
m2="${m2#0}"
|
m2="${m2#0}"
|
||||||
done # dash has issues when numbers have leading 0's
|
done # dash has issues when numbers have leading 0's
|
||||||
|
|
||||||
# zsh,bash,etc don't need this at all
|
# zsh,bash,etc don't need this at all
|
||||||
# and really dash shouldn't either but /shrug
|
# and really dash shouldn't either but /shrug
|
||||||
|
|
||||||
#printf '%s\n%s\n' "${m1}*${m2}" "9223372036854775807"
|
#printf '%s\n%s\n' "${m1}*${m2}" "9223372036854775807"
|
||||||
ad "$((m1*m2))" "$dn"
|
ad "$((m1*m2))" "$dn"
|
||||||
|
|
|
@ -37,7 +37,9 @@ elif [ ! -z "${2##*.*}" ]; then
|
||||||
done
|
done
|
||||||
fi # if $1/$2 is not a float; convert to float
|
fi # if $1/$2 is not a float; convert to float
|
||||||
m1="${1%.*}${1#*.}"; m2="${2%.*}${2#*.}"
|
m1="${1%.*}${1#*.}"; m2="${2%.*}${2#*.}"
|
||||||
dn=$((${1%.*}-${2%.*})); dn="${dn#-}"; dn="${#dn}"
|
dn=$((${1%.*}-${2%.*})); # dn == dp
|
||||||
|
# dn can also be checked to see if the wrong whole number result produced is correct
|
||||||
|
dn="${dn#-}"; dn="${#dn}"
|
||||||
# decimal place is determined by the length of $1-$2
|
# decimal place is determined by the length of $1-$2
|
||||||
# without decimals
|
# without decimals
|
||||||
## SWAP IF $1 > $2; negative handling
|
## SWAP IF $1 > $2; negative handling
|
||||||
|
@ -54,4 +56,9 @@ until [ "${m2#0}" = "$m2" ]; do
|
||||||
done # dash has issues when numbers have leading 0's
|
done # dash has issues when numbers have leading 0's
|
||||||
# zsh,bash,etc don't need this at all
|
# zsh,bash,etc don't need this at all
|
||||||
# and really dash shouldn't either but /shrug
|
# and really dash shouldn't either but /shrug
|
||||||
|
##
|
||||||
|
# if $m1 is longer than $m2 it may cause it to produce wrong results
|
||||||
|
[ -z "${2##*.*}" ] && until [ "${#m2}" -eq "${#m1}" ]; do
|
||||||
|
m2="${m2}0"
|
||||||
|
done
|
||||||
rad "$((m1-m2))" "$dn" "${nr}"
|
rad "$((m1-m2))" "$dn" "${nr}"
|
||||||
|
|
Loading…
Reference in a new issue