in reply to sub as mathematical function

Provided

> input: float 0 to 1 inclusive

It's  int(9*$v)

Edit

Corrected off by one

Updated

Corrected correction ;)

Updated

The edge case 1=9/9 needs special treatment. Are you sure 8 is the maximum?

If yes max(8,int(9*$v))

max needs to be imported. (POSIX?)

List::Util#max

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^2: sub as mathematical function
by Anonymous Monk on Sep 04, 2019 at 12:29 UTC
    min(int(9*$x),8) is perfect thanks all :-)
      Oh ... off by max, again! ;-)

      update

      I wouldn't count on correct input though, and additional max seems safe

      DB<5> print $_,":",max(min(int(9*$_/18),8),0),"\n" for -2..20 -2:0 -1:0 0:0 1:0 2:1 3:1 4:2 5:2 6:3 7:3 8:4 9:4 10:5 11:5 12:6 13:6 14:7 15:7 16:8 17:8 18:8 19:8 20:8

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

        The subexpression 9*X/18 == (9x)/18 == x/2. Therefore, max(min(int($_ / 2), 8, 0);


        Dave

      >> min(int(9*$x),8)

      When number of intervals vary (not only 9), then this looks more general:
      my $intervals = 9; min( int( $intervals * $x ), $intervals - 1 )
      or:
      my $intervals = 9; int( $intervals * $x ) - int $x