zsh-users
 help / color / mirror / code / Atom feed
* 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).