Re: Limts of arclength

luigi scarso <[email protected]> Thu, 24 Apr 2025 11:20:57 +0200
Newsgroups gmane.comp.tex.metapost
Message-ID <CAG5iGsDo0AQLs4BNKfT5e3Xo+Snnr7CnodMMokAbczSn8nHTwg@mail.gmail.com>
--===============1835159522873166951==
Content-Type: multipart/alternative; boundary="000000000000ff040a063382bcb4"

--000000000000ff040a063382bcb4
Content-Type: text/plain; charset="UTF-8"

On Wed, 23 Apr 2025 at 17:10, Toby Thurston <[email protected]> wrote:

> This is related to the earlier query about intersectiontimes failing with
> long paths.
>
> I don't think that I am reporting a bug here, but I just wanted to
> understand the limits on arclength of paths.
>
> Consider this program:
>
> > warningcheck := 0;
> > N = 2**15 - 1;
> >
> > show numbersystem;
> > show arclength (origin -- right * (N + 63/64));
> > show arclength (origin -- right * (N + 1    ));
> > end
> >
>
> With the scaled number system, I get this output
>
> > >> "scaled"
> > >> 32767.98438
> > ! Arithmetic overflow.
> > l.6 ... arclength (origin -- right * (N + 1    ));
> >
> > ?
> > >> 32767.99998 )
>
>
> Here `arclength` has failed when the result is >= 2**15 which is perhaps
> not surprising since the MetafontBook
> tells us
>
> "On the other hand, it turns out that larger numbers can actually
> arise when an expression is being evaluated; MetaFont doesn't
> worry about this unless the resulting magnitude is at least 32768."
>
> And if I run that with one of the new number systems I get no error:
>
> > >> "decimal"
> > >> 32767.98438262939453125000000000006
> > >> 32768.00000762939453125000000000008 )
>
> (At least no error up to 5 decimal places... )
>
> But if I increase the limit, I do get an arithmetic overflow.  Trial and
> error
> shows that the magic number is now 2**15 * 3/2 = 49152
>
> > warningcheck := 0;
> > N = 2**15 * 3/2 - 1;
> >
> > show numbersystem;
> > show arclength (origin -- right * (N + 63/64));
> > show arclength (origin -- right * (N + 1    ));
> > end
>
>
> With this new value for N, I get this:
>
> > >> "decimal"
> > >> 49151.9843826293945312500000000001
> > ! Arithmetic overflow.
> > l.6 ... arclength (origin -- right * (N + 1    ));
> >
> > ?
> > >> 1E+1000000 )
>
> and
>
> > >> "interval"
> > >> 49151.984382629394531249999999999886
> > ! Arithmetic overflow.
> > l.6 ... arclength (origin -- right * (N + 1    ));
> >
> > ?
> > >> -2 )
>
>
> why is there an overflow with these other number systems?  And why at
> 2**15 * 3/2 ??
>
> Thanks Toby
> --
> http://tug.org/metapost/



numberprecision:=11; %%binary ok, decimal ok, double ok.
warningcheck := 0;
N := 2**15 * 3/2 - 1;
%%N := 2**15 - 1;

show numbersystem;
show arclength (origin -- right * (N + 63/64));
show arclength (origin -- right * (N + 1    ));
end

The point is here,

10137 @ It is convenient to have a simpler interface to |arc_test| that
requires no
  10138 unnecessary arguments and ensures that each $({\it dx},{\it dy})$
pair has
  10139 length less than |fraction_four|.
  10140
  10141 @c
  10142 static void mp_do_arc_test (MP mp, mp_number *ret, mp_number dx0,
mp_number dy0, mp_number dx1,
  10143                               mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
  10144   mp_number v0, v1, v2;    /* length of each $({\it dx},{\it dy})$
pair */
  10145   mp_number v02;   /* twice the norm of the quadratic at
$t={1\over2}$ */
  10146   new_number (v0);
  10147   new_number (v1);
  10148   new_number (v2);
  10149   pyth_add (v0, dx0, dy0);
  10150   pyth_add (v1, dx1, dy1);
  10151   pyth_add (v2, dx2, dy2);
  10152   if ((number_greaterequal(v0, fraction_four_t)) ||
  10153       (number_greaterequal(v1, fraction_four_t)) ||
  10154       (number_greaterequal(v2, fraction_four_t))) {
  10155     mp->arith_error = true;

where fraction_four_t = 16384

Printing v0,v1,v2  we have
%%% double %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x555555e561e0 "16383.994791666659"
$2 = 0x555555e57590 "16383.994791666662"
$3 = 0x555555e575e0 "16383.994791666657"

>> 49151.98438262938
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.

Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x555555e57630 "16383.", '9' <repeats 11 times>, "3"
$5 = 0x555555e57680 "16383.", '9' <repeats 11 times>, "3"
$6 = 0x555555e576d0 "16383.", '9' <repeats 11 times>, "3"

>> 49152.000007629373 )
Transcript written on test1.log.
[Inferior 1 (process 2815236) exited normally]



%%% binary %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x5555562a5810 "16383.9947903"
$2 = 0x55555649ee50 "16383.9947908"
$3 = 0x55555649ee80 "16383.9947901"

>> 49151.9843788
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.

Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x55555649f4d0 "16383.9999988"
$5 = 0x55555649fe90 "16383.9999983"
$6 = 0x55555649fec0 "16383.999999"

>> 49152.0000038 )
Transcript written on test1.log.
[Inferior 1 (process 2816270) exited normally]


%%% decimal %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x55555672cec0 "16383.994785"
$2 = 0x55555672bb10 "16383.994786"
$3 = 0x555556724220 "16383.994785"

>> 49151.984366
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.

Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x5555567240b0 "16383.999994"
$5 = 0x55555672bb40 "16383.999993"
$6 = 0x55555672bb70 "16383.999994"

>> 49151.99999 )
Transcript written on test1.log.
[Inferior 1 (process 2816586) exited normally]


If we set numberprecision:=12 ;


%%% binary %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x5555562a5810 "16383.99479151"
$2 = 0x55555649ee60 "16383.99479151"
$3 = 0x55555649ee90 "16383.99479151"

>> 49151.98438215
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.

Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x55555649f4e0 "16383.99999985"
$5 = 0x55555649fea0 "16383.99999979"
$6 = 0x55555649fed0 "16383.99999988"

>> 49152.00000715 )
Transcript written on test1.log.
[Inferior 1 (process 2818414) exited normally]



%%% decimal %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x55555672cec0 "16383.9947917"
$2 = 0x55555672bb10 "16383.9947916"
$3 = 0x555556724220 "16383.9947917"

>> 49151.9843828
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.

Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x55555672bad0 "16384"
$5 = 0x55555672a2e0 "16384"
$6 = 0x55555672a2c0 "16384"

Hardware watchpoint 5: mp->arith_error

Old value = 0
New value = 1


With numberprecision:=14 ;

%%% binary %%%
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$1 = 0x5555562a5ac0 "16383.9947916679"
$2 = 0x5555562a5b00 "16383.9947916679"
$3 = 0x5555562a5b40 "16383.9947916679"

>> 49151.9843826331
Breakpoint 3, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10143
10143                                 mp_number dy1, mp_number dx2,
mp_number dy2, mp_number a_goal) {
(gdb)
Continuing.


with
Breakpoint 4, mp_do_arc_test (mp=0x555555da6720, ret=0x7fffffffd130,
dx0=..., dy0=..., dx1=..., dy1=..., dx2=..., dy2=..., a_goal=...) at
../../../source/texk/web2c/mplibdir/mp.w:10152
10152     if ((number_greaterequal(v0, fraction_four_t)) ||
$4 = 0x5555562a5b80 "16384.0000000014"
$5 = 0x5555562a5a00 "16384.0000000005"
$6 = 0x5555562a5c00 "16384.0000000019"

Hardware watchpoint 5: mp->arith_error

Old value = 0
New value = 1

It also fails with a low precision, i.e. numberprecision <=10;


--
luigi

--000000000000ff040a063382bcb4
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><br></div><br><div class=3D"gmail_quote g=
mail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, 23 Apr =
2025 at 17:10, Toby Thurston &lt;<a href=3D"mailto:[email protected]">thursto=
[email protected]</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex">This is related to the earlier query about intersectiontimes failin=
g with long paths.<br>
<br>
I don&#39;t think that I am reporting a bug here, but I just wanted to unde=
rstand the limits on arclength of paths.<br>
<br>
Consider this program:<br>
<br>
&gt; warningcheck :=3D 0;<br>
&gt; N =3D 2**15 - 1;<br>
&gt; <br>
&gt; show numbersystem;<br>
&gt; show arclength (origin -- right * (N + 63/64));<br>
&gt; show arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br>
&gt; end<br>
&gt; <br>
<br>
With the scaled number system, I get this output<br>
<br>
&gt; &gt;&gt; &quot;scaled&quot;<br>
&gt; &gt;&gt; 32767.98438<br>
&gt; ! Arithmetic overflow.<br>
&gt; l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<br>
&gt; ? <br>
&gt; &gt;&gt; 32767.99998 )<br>
<br>
<br>
Here `arclength` has failed when the result is &gt;=3D 2**15 which is perha=
ps not surprising since the MetafontBook<br>
tells us <br>
<br>
&quot;On the other hand, it turns out that larger numbers can actually <br>
arise when an expression is being evaluated; MetaFont doesn&#39;t<br>
worry about this unless the resulting magnitude is at least 32768.&quot;<br=
>
<br>
And if I run that with one of the new number systems I get no error:<br>
<br>
&gt; &gt;&gt; &quot;decimal&quot;<br>
&gt; &gt;&gt; 32767.98438262939453125000000000006<br>
&gt; &gt;&gt; 32768.00000762939453125000000000008 )<br>
<br>
(At least no error up to 5 decimal places... )<br>
<br>
But if I increase the limit, I do get an arithmetic overflow.=C2=A0 Trial a=
nd error<br>
shows that the magic number is now 2**15 * 3/2 =3D 49152<br>
<br>
&gt; warningcheck :=3D 0;<br>
&gt; N =3D 2**15 * 3/2 - 1;<br>
&gt; <br>
&gt; show numbersystem;<br>
&gt; show arclength (origin -- right * (N + 63/64));<br>
&gt; show arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br>
&gt; end<br>
<br>
<br>
With this new value for N, I get this:<br>
<br>
&gt; &gt;&gt; &quot;decimal&quot;<br>
&gt; &gt;&gt; 49151.9843826293945312500000000001<br>
&gt; ! Arithmetic overflow.<br>
&gt; l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<br>
&gt; ? <br>
&gt; &gt;&gt; 1E+1000000 )<br>
<br>
and<br>
<br>
&gt; &gt;&gt; &quot;interval&quot;<br>
&gt; &gt;&gt; 49151.984382629394531249999999999886<br>
&gt; ! Arithmetic overflow.<br>
&gt; l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<br>
&gt; ? <br>
&gt; &gt;&gt; -2 )<br>
<br>
<br>
why is there an overflow with these other number systems?=C2=A0 And why at =
2**15 * 3/2 ??<br>
<br>
Thanks Toby<br>
--<br>
<a href=3D"http://tug.org/metapost/" rel=3D"noreferrer" target=3D"_blank">h=
ttp://tug.org/metapost/</a></blockquote><div><br></div><div><br></div><div>=
numberprecision:=3D11; %%binary ok, decimal ok, double ok.<br>warningcheck =
:=3D 0;<br>N :=3D 2**15 * 3/2 - 1;<br>%%N :=3D 2**15 - 1;<br><br>show numbe=
rsystem;<br>show arclength (origin -- right * (N + 63/64));<br>show arcleng=
th (origin -- right * (N + 1 =C2=A0 =C2=A0));<br>end<br></div><div><br></di=
v><div>The point is here,=C2=A0</div><div><br></div><div>10137 @ It is conv=
enient to have a simpler interface to |arc_test| that requires no<br>=C2=A0=
 10138 unnecessary arguments and ensures that each $({\it dx},{\it dy})$ pa=
ir has<br>=C2=A0 10139 length less than |fraction_four|.<br>=C2=A0 10140 <b=
r>=C2=A0 10141 @c<br>=C2=A0 10142 static void mp_do_arc_test (MP mp, mp_num=
ber *ret, mp_number dx0, mp_number dy0, mp_number dx1,<br>=C2=A0 10143 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2, mp_number dy2, mp=
_number a_goal) {<br>=C2=A0 10144 =C2=A0 mp_number v0, v1, v2; =C2=A0 =C2=
=A0/* length of each $({\it dx},{\it dy})$ pair */<br>=C2=A0 10145 =C2=A0 m=
p_number v02; =C2=A0 /* twice the norm of the quadratic at $t=3D{1\over2}$ =
*/<br>=C2=A0 10146 =C2=A0 new_number (v0);<br>=C2=A0 10147 =C2=A0 new_numbe=
r (v1);<br>=C2=A0 10148 =C2=A0 new_number (v2);<br>=C2=A0 10149 =C2=A0 pyth=
_add (v0, dx0, dy0);<br>=C2=A0 10150 =C2=A0 pyth_add (v1, dx1, dy1);<br>=C2=
=A0 10151 =C2=A0 pyth_add (v2, dx2, dy2);<br>=C2=A0 10152 =C2=A0 if ((numbe=
r_greaterequal(v0, fraction_four_t)) ||<br>=C2=A0 10153 =C2=A0 =C2=A0 =C2=
=A0 (number_greaterequal(v1, fraction_four_t)) ||<br>=C2=A0 10154 =C2=A0 =
=C2=A0 =C2=A0 (number_greaterequal(v2, fraction_four_t))) {<br>=C2=A0 10155=
 =C2=A0 =C2=A0 mp-&gt;arith_error =3D true;<br></div><div><br></div><div>wh=
ere fraction_four_t =3D 16384</div><div><br></div><div>Printing v0,v1,v2=C2=
=A0 we have=C2=A0</div><div>%%% double %%%<br>Breakpoint 4, mp_do_arc_test =
(mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D...=
, dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/texk/we=
b2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequal(v0,=
 fraction_four_t)) ||<br>$1 =3D 0x555555e561e0 &quot;16383.994791666659&quo=
t;<br>$2 =3D 0x555555e57590 &quot;16383.994791666662&quot;<br>$3 =3D 0x5555=
55e575e0 &quot;16383.994791666657&quot;<br><br>&gt;&gt; 49151.98438262938<b=
r>Breakpoint 3, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, =
dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D=
...) at ../../../source/texk/web2c/mplibdir/mp.w:10143<br>10143 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2, mp_number dy2, mp=
_number a_goal) {<br>(gdb) <br>Continuing.<br><br>Breakpoint 4, mp_do_arc_t=
est (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=
=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/t=
exk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequ=
al(v0, fraction_four_t)) ||<br>$4 =3D 0x555555e57630 &quot;16383.&quot;, &#=
39;9&#39; &lt;repeats 11 times&gt;, &quot;3&quot;<br>$5 =3D 0x555555e57680 =
&quot;16383.&quot;, &#39;9&#39; &lt;repeats 11 times&gt;, &quot;3&quot;<br>=
$6 =3D 0x555555e576d0 &quot;16383.&quot;, &#39;9&#39; &lt;repeats 11 times&=
gt;, &quot;3&quot;<br><br>&gt;&gt; 49152.000007629373 )<br>Transcript writt=
en on test1.log.<br>[Inferior 1 (process 2815236) exited normally]<br><br><=
br></div><div><br></div><div>%%% binary %%%=C2=A0</div><div>Breakpoint 4, m=
p_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D=
..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../=
source/texk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_gr=
eaterequal(v0, fraction_four_t)) ||<br>$1 =3D 0x5555562a5810 &quot;16383.99=
47903&quot;<br>$2 =3D 0x55555649ee50 &quot;16383.9947908&quot;<br>$3 =3D 0x=
55555649ee80 &quot;16383.9947901&quot;<br><br>&gt;&gt; 49151.9843788<br>Bre=
akpoint 3, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=
=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...=
) at ../../../source/texk/web2c/mplibdir/mp.w:10143<br>10143 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2, mp_number dy2, mp_nu=
mber a_goal) {<br>(gdb) <br>Continuing.<br><br>Breakpoint 4, mp_do_arc_test=
 (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..=
., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/texk/w=
eb2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequal(v0=
, fraction_four_t)) ||<br>$4 =3D 0x55555649f4d0 &quot;16383.9999988&quot;<b=
r>$5 =3D 0x55555649fe90 &quot;16383.9999983&quot;<br>$6 =3D 0x55555649fec0 =
&quot;16383.999999&quot;<br><br>&gt;&gt; 49152.0000038 )<br>Transcript writ=
ten on test1.log.<br>[Inferior 1 (process 2816270) exited normally]<br></di=
v><div><br></div><div><br></div><div>%%% decimal %%%=C2=A0</div><div>Breakp=
oint 4, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..=
., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at =
../../../source/texk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((=
number_greaterequal(v0, fraction_four_t)) ||<br>$1 =3D 0x55555672cec0 &quot=
;16383.994785&quot;<br>$2 =3D 0x55555672bb10 &quot;16383.994786&quot;<br>$3=
 =3D 0x555556724220 &quot;16383.994785&quot;<br><br>&gt;&gt; 49151.984366<b=
r>Breakpoint 3, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, =
dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D=
...) at ../../../source/texk/web2c/mplibdir/mp.w:10143<br>10143 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2, mp_number dy2, mp=
_number a_goal) {<br>(gdb) <br>Continuing.<br><br>Breakpoint 4, mp_do_arc_t=
est (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=
=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/t=
exk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequ=
al(v0, fraction_four_t)) ||<br>$4 =3D 0x5555567240b0 &quot;16383.999994&quo=
t;<br>$5 =3D 0x55555672bb40 &quot;16383.999993&quot;<br>$6 =3D 0x55555672bb=
70 &quot;16383.999994&quot;<br><br>&gt;&gt; 49151.99999 )<br>Transcript wri=
tten on test1.log.<br>[Inferior 1 (process 2816586) exited normally]<br></d=
iv><div><br></div><div><br></div><div>If we set=C2=A0numberprecision:=3D12 =
;</div><div><br></div><div><br></div><div>%%% binary %%%=C2=A0=C2=A0</div><=
div>Breakpoint 4, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130=
, dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=
=3D...) at ../../../source/texk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =
=C2=A0 if ((number_greaterequal(v0, fraction_four_t)) ||<br>$1 =3D 0x555556=
2a5810 &quot;16383.99479151&quot;<br>$2 =3D 0x55555649ee60 &quot;16383.9947=
9151&quot;<br>$3 =3D 0x55555649ee90 &quot;16383.99479151&quot;<br><br>&gt;&=
gt; 49151.98438215<br>Breakpoint 3, mp_do_arc_test (mp=3D0x555555da6720, re=
t=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., =
dy2=3D..., a_goal=3D...) at ../../../source/texk/web2c/mplibdir/mp.w:10143<=
br>10143 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2,=
 mp_number dy2, mp_number a_goal) {<br>(gdb) <br>Continuing.<br><br>Breakpo=
int 4, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D...=
, dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at .=
./../../source/texk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((n=
umber_greaterequal(v0, fraction_four_t)) ||<br>$4 =3D 0x55555649f4e0 &quot;=
16383.99999985&quot;<br>$5 =3D 0x55555649fea0 &quot;16383.99999979&quot;<br=
>$6 =3D 0x55555649fed0 &quot;16383.99999988&quot;<br><br>&gt;&gt; 49152.000=
00715 )<br>Transcript written on test1.log.<br>[Inferior 1 (process 2818414=
) exited normally]<br></div><div><br></div><div><br></div><div><br></div><d=
iv>%%% decimal %%%=C2=A0</div><div>Breakpoint 4, mp_do_arc_test (mp=3D0x555=
555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D...=
, dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/texk/web2c/mplibdi=
r/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequal(v0, fraction_f=
our_t)) ||<br>$1 =3D 0x55555672cec0 &quot;16383.9947917&quot;<br>$2 =3D 0x5=
5555672bb10 &quot;16383.9947916&quot;<br>$3 =3D 0x555556724220 &quot;16383.=
9947917&quot;<br><br>&gt;&gt; 49151.9843828<br>Breakpoint 3, mp_do_arc_test=
 (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..=
., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/texk/w=
eb2c/mplibdir/mp.w:10143<br>10143 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mp_n=
umber dy1, mp_number dx2, mp_number dy2, mp_number a_goal) {<br>(gdb) <br>C=
ontinuing.<br><br>Breakpoint 4, mp_do_arc_test (mp=3D0x555555da6720, ret=3D=
0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=
=3D..., a_goal=3D...) at ../../../source/texk/web2c/mplibdir/mp.w:10152<br>=
10152 =C2=A0 =C2=A0 if ((number_greaterequal(v0, fraction_four_t)) ||<br>$4=
 =3D 0x55555672bad0 &quot;16384&quot;<br>$5 =3D 0x55555672a2e0 &quot;16384&=
quot;<br>$6 =3D 0x55555672a2c0 &quot;16384&quot;<br><br>Hardware watchpoint=
 5: mp-&gt;arith_error<br><br>Old value =3D 0<br>New value =3D 1<br></div><=
div><br></div><div><br></div><div>With=C2=A0numberprecision:=3D14 ;</div><d=
iv><br></div><div>%%% binary %%%=C2=A0<br>Breakpoint 4, mp_do_arc_test (mp=
=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D..., dy0=3D..., dx1=3D..., d=
y1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ../../../source/texk/web2c=
/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=A0 if ((number_greaterequal(v0, fr=
action_four_t)) ||<br>$1 =3D 0x5555562a5ac0 &quot;16383.9947916679&quot;<br=
>$2 =3D 0x5555562a5b00 &quot;16383.9947916679&quot;<br>$3 =3D 0x5555562a5b4=
0 &quot;16383.9947916679&quot;<br><br>&gt;&gt; 49151.9843826331<br>Breakpoi=
nt 3, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, dx0=3D...,=
 dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D...) at ..=
/../../source/texk/web2c/mplibdir/mp.w:10143<br>10143 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 mp_number dy1, mp_number dx2, mp_number dy2, mp_number a_=
goal) {<br>(gdb) <br>Continuing.<br><br><br></div><div>with=C2=A0</div><div=
>Breakpoint 4, mp_do_arc_test (mp=3D0x555555da6720, ret=3D0x7fffffffd130, d=
x0=3D..., dy0=3D..., dx1=3D..., dy1=3D..., dx2=3D..., dy2=3D..., a_goal=3D.=
..) at ../../../source/texk/web2c/mplibdir/mp.w:10152<br>10152 =C2=A0 =C2=
=A0 if ((number_greaterequal(v0, fraction_four_t)) ||<br>$4 =3D 0x5555562a5=
b80 &quot;16384.0000000014&quot;<br>$5 =3D 0x5555562a5a00 &quot;16384.00000=
00005&quot;<br>$6 =3D 0x5555562a5c00 &quot;16384.0000000019&quot;<br><br>Ha=
rdware watchpoint 5: mp-&gt;arith_error<br><br>Old value =3D 0<br>New value=
 =3D 1<br></div><div>=C2=A0</div><div>It also fails with a low precision, i=
.e. numberprecision=C2=A0&lt;=3D10;</div><div><br></div><div><br></div><div=
>--</div><div>luigi</div><div><br></div><div><br></div></div></div>

--000000000000ff040a063382bcb4--

--===============1835159522873166951==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

--
http://tug.org/metapost/

--===============1835159522873166951==--