[metapost] New numbersystems strange behaviour of arclength

luigi scarso luigi.scarso at gmail.com
Wed Mar 13 09:49:31 CET 2019


On Tue, Mar 12, 2019 at 7:03 PM Karel <horakk at math.cas.cz> wrote:

> Dear Luigi,
>
> the following code
>
> beginfig(0);
> path s;
> s:=fullcircle scaled 30mm;
> for k=0 upto 18: draw origin--point(arctime ((k/36)*arclength s) of s)
> of s; endfor
> endfig;
> end
>
> gives very strange results when used with
> numbersystem=decimal or binary (mpost 2.00 for TeXlive 2019).
>
>

if numbersystem="decimal":
 numberprecision:=8;
fi;
if numbersystem="binary":
 numberprecision:=8;
fi;
beginfig(0);
path s;
s:=fullcircle scaled 30mm;
%tracingall;
message "==> "  & decimal(arclength s);
for k=1 upto 1:
message "==> "  & decimal(arctime((1/1)*arclength s) of s);
%%draw origin--point(arctime ((k/36)*arclength s) of s) of s;
endfor
endfig;
end.


In mp.w :
static void mp_get_arc_time (MP mp, mp_number *ret, mp_knot h, mp_number
arc0_orig)
:

      if (q == h) {
         @<Update |t_tot| and |arc| to avoid going around the cyclic
           path too many times but set |arith_error:=true| and |goto done|
on
           overflow@>;

@ @<Update |t_tot| and |arc| to avoid going around the cyclic...@>=
if (number_positive(arc)) {

when q==h
decimal  arc = 0.000004
scaled:   arc = 0
This gives
if (number_positive(arc)) true for decimal and false for scaled, so we
return with different times.

I don't know if  it's correct -- iirc this algorithm was  designed for
scaled  so different using numbersystems can give different results --
or if it's not robust even for scaled.

Try for example with
if numbersystem="decimal":
 numberprecision:=4;
fi;



-- 
luigi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://tug.org/pipermail/metapost/attachments/20190313/0044e672/attachment.html>


More information about the metapost mailing list