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 <<a href=3D"mailto:[email protected]">thursto= [email protected]</a>> 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'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> > warningcheck :=3D 0;<br> > N =3D 2**15 - 1;<br> > <br> > show numbersystem;<br> > show arclength (origin -- right * (N + 63/64));<br> > show arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br> > end<br> > <br> <br> With the scaled number system, I get this output<br> <br> > >> "scaled"<br> > >> 32767.98438<br> > ! Arithmetic overflow.<br> > l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br> >=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> > ? <br> > >> 32767.99998 )<br> <br> <br> Here `arclength` has failed when the result is >=3D 2**15 which is perha= ps not surprising since the MetafontBook<br> tells us <br> <br> "On the other hand, it turns out that larger numbers can actually <br> arise when an expression is being evaluated; MetaFont doesn't<br> worry about this unless the resulting magnitude is at least 32768."<br= > <br> And if I run that with one of the new number systems I get no error:<br> <br> > >> "decimal"<br> > >> 32767.98438262939453125000000000006<br> > >> 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> > warningcheck :=3D 0;<br> > N =3D 2**15 * 3/2 - 1;<br> > <br> > show numbersystem;<br> > show arclength (origin -- right * (N + 63/64));<br> > show arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br> > end<br> <br> <br> With this new value for N, I get this:<br> <br> > >> "decimal"<br> > >> 49151.9843826293945312500000000001<br> > ! Arithmetic overflow.<br> > l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br> >=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> > ? <br> > >> 1E+1000000 )<br> <br> and<br> <br> > >> "interval"<br> > >> 49151.984382629394531249999999999886<br> > ! Arithmetic overflow.<br> > l.6 ... arclength (origin -- right * (N + 1=C2=A0 =C2=A0 ));<br> >=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> > ? <br> > >> -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->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 "16383.994791666659&quo= t;<br>$2 =3D 0x555555e57590 "16383.994791666662"<br>$3 =3D 0x5555= 55e575e0 "16383.994791666657"<br><br>>> 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 "16383.", &#= 39;9' <repeats 11 times>, "3"<br>$5 =3D 0x555555e57680 = "16383.", '9' <repeats 11 times>, "3"<br>= $6 =3D 0x555555e576d0 "16383.", '9' <repeats 11 times&= gt;, "3"<br><br>>> 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 "16383.99= 47903"<br>$2 =3D 0x55555649ee50 "16383.9947908"<br>$3 =3D 0x= 55555649ee80 "16383.9947901"<br><br>>> 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 "16383.9999988"<b= r>$5 =3D 0x55555649fe90 "16383.9999983"<br>$6 =3D 0x55555649fec0 = "16383.999999"<br><br>>> 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 "= ;16383.994785"<br>$2 =3D 0x55555672bb10 "16383.994786"<br>$3= =3D 0x555556724220 "16383.994785"<br><br>>> 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 "16383.999994&quo= t;<br>$5 =3D 0x55555672bb40 "16383.999993"<br>$6 =3D 0x55555672bb= 70 "16383.999994"<br><br>>> 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 "16383.99479151"<br>$2 =3D 0x55555649ee60 "16383.9947= 9151"<br>$3 =3D 0x55555649ee90 "16383.99479151"<br><br>>&= 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 "= 16383.99999985"<br>$5 =3D 0x55555649fea0 "16383.99999979"<br= >$6 =3D 0x55555649fed0 "16383.99999988"<br><br>>> 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 "16383.9947917"<br>$2 =3D 0x5= 5555672bb10 "16383.9947916"<br>$3 =3D 0x555556724220 "16383.= 9947917"<br><br>>> 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 "16384"<br>$5 =3D 0x55555672a2e0 "16384&= quot;<br>$6 =3D 0x55555672a2c0 "16384"<br><br>Hardware watchpoint= 5: mp->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 "16383.9947916679"<br= >$2 =3D 0x5555562a5b00 "16383.9947916679"<br>$3 =3D 0x5555562a5b4= 0 "16383.9947916679"<br><br>>> 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 "16384.0000000014"<br>$5 =3D 0x5555562a5a00 "16384.00000= 00005"<br>$6 =3D 0x5555562a5c00 "16384.0000000019"<br><br>Ha= rdware watchpoint 5: mp->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<=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==--