* 1.75 -> 1-3/4
@ 2018-06-04 22:09 Emanuel Berg
2018-06-05 3:26 ` Artur Penttinen
2018-06-05 22:32 ` Matthew Martin
0 siblings, 2 replies; 5+ messages in thread
From: Emanuel Berg @ 2018-06-04 22:09 UTC (permalink / raw)
To: zsh-users
Is this [1] the correct algorithm/a good
implementation? It translates 1.75 into 1-3/4
at least :P
ths () {
local value=$1
local denom=${2:-16}
local whole=$(( int(floor($value)) ))
local rest=$(( $value - $whole ))
local frac=$(( int(rint($rest * $denom)) ))
if (( $(( $frac % 2 )) == 0 )); then
local new_denom=$(( denom / 2 ))
ths $value $new_denom
else
echo $whole-${frac}/${denom}
fi
}
# $ ths 1.75
# 1-3/4
[1] http://user.it.uu.se/~embe8573/conf/.zsh/math
--
underground experts united
http://user.it.uu.se/~embe8573
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: 1.75 -> 1-3/4
2018-06-04 22:09 1.75 -> 1-3/4 Emanuel Berg
@ 2018-06-05 3:26 ` Artur Penttinen
2018-06-05 12:52 ` Emanuel Berg
2018-06-05 22:32 ` Matthew Martin
1 sibling, 1 reply; 5+ messages in thread
From: Artur Penttinen @ 2018-06-05 3:26 UTC (permalink / raw)
To: Emanuel Berg, zsh-users
05.06.2018, 01:27, "Emanuel Berg" <moasen@zoho.com>:
> Is this [1] the correct algorithm/a good
> implementation? It translates 1.75 into 1-3/4
> at least :P
>
> ths () {
> local value=$1
> local denom=${2:-16}
> local whole=$(( int(floor($value)) ))
> local rest=$(( $value - $whole ))
> local frac=$(( int(rint($rest * $denom)) ))
> if (( $(( $frac % 2 )) == 0 )); then
> local new_denom=$(( denom / 2 ))
> ths $value $new_denom
> else
> echo $whole-${frac}/${denom}
> fi
> }
> # $ ths 1.75
> # 1-3/4
>
> [1] http://user.it.uu.se/~embe8573/conf/.zsh/math
# ths 2
ths:8: maximum nested function level reached; increase FUNCNEST?
--
wbw, artur
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: 1.75 -> 1-3/4
2018-06-05 3:26 ` Artur Penttinen
@ 2018-06-05 12:52 ` Emanuel Berg
0 siblings, 0 replies; 5+ messages in thread
From: Emanuel Berg @ 2018-06-05 12:52 UTC (permalink / raw)
To: zsh-users
Artur Penttinen wrote:
>> [1] http://user.it.uu.se/~embe8573/conf/.zsh/math
>
> # ths 2
> ths:8: maximum nested function level reached; increase FUNCNEST?
Terve/priviet, nice catch, here's an update:
ths () {
local value=$1
local denom=${2:-16}
local whole=$(( int(floor($value)) ))
local rest=$(( $value - $whole ))
local frac=$(( int(rint($rest * $denom)) ))
if (( $frac > 0 && $(( $frac % 2 )) == 0 )); then
local new_denom=$(( denom / 2 ))
ths $value $new_denom
else
local frace
(( $frac > 0 )) && frace=-${frac}/${denom}
echo ${whole}${frace}
fi
}
# $ ths 2.0
# 2
# $ ths 1.75
# 1-3/4
--
underground experts united
http://user.it.uu.se/~embe8573
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: 1.75 -> 1-3/4
2018-06-04 22:09 1.75 -> 1-3/4 Emanuel Berg
2018-06-05 3:26 ` Artur Penttinen
@ 2018-06-05 22:32 ` Matthew Martin
2018-06-06 17:48 ` Emanuel Berg
1 sibling, 1 reply; 5+ messages in thread
From: Matthew Martin @ 2018-06-05 22:32 UTC (permalink / raw)
To: zsh-users
On Tue, Jun 05, 2018 at 12:09:20AM +0200, Emanuel Berg wrote:
> Is this [1] the correct algorithm/a good
> implementation? It translates 1.75 into 1-3/4
> at least :P
What comes to mind first for me is the following.
- Matthew Martin
ths() {
local decmal
local -i denom num whole
if [[ $1 != *.* ]]; then
print -- $1
return
fi
whole=${1%.*}
decimal=${1#*.}
num=$decimal
denom=$(( 10 ** ${#decimal} ))
for d in 2 5; do
while (( num % d == 0 && denom % d == 0 )); do
(( num /= d ))
(( denom /= d ))
done
done
(( whole )) && print -n -- $whole
(( whole && num )) && print -n ' '
(( num )) && print -n -- $num/$denom
print
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: 1.75 -> 1-3/4
2018-06-05 22:32 ` Matthew Martin
@ 2018-06-06 17:48 ` Emanuel Berg
0 siblings, 0 replies; 5+ messages in thread
From: Emanuel Berg @ 2018-06-06 17:48 UTC (permalink / raw)
To: zsh-users
Matthew Martin wrote:
> What comes to mind first for me is the
> following [...]
Great work, only it is too good (I call your
function ths-mm) - compare:
$ ths 1.75
1-3/4
$ ths 1.73
1-3/4
$ ths-mm 1.75
1 3/4
$ ths-mm 1.73
1 73/100
If you devide into hundreds, you might as well
use the much better decimal system, right?
Tho one thing that is clearly better with
ths-mm is no recursion...
--
underground experts united
http://user.it.uu.se/~embe8573
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-06-06 17:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-04 22:09 1.75 -> 1-3/4 Emanuel Berg
2018-06-05 3:26 ` Artur Penttinen
2018-06-05 12:52 ` Emanuel Berg
2018-06-05 22:32 ` Matthew Martin
2018-06-06 17:48 ` Emanuel Berg
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).