cos should check for 1.5p1 as well as 0.5p1 :

   cos=: 2&o. * 0.5p1 1.5p1 -.@(e.!.0)~ |

With this change, we get:

   mexp (i.4) * ^.0j1
1 0j1 _1 0j_1



----- Original Message -----
From: Roger Hui <[email protected]>
Date: Monday, May 25, 2009 10:10
Subject: Re: [Jchat] Clean elementary functions?
To: Chat forum <[email protected]>

> I believe that if you want a "clean" result at all,
> it's better to give it for sin and cos only if the 
> argument is the best possible 64-bit representation 
> for pi (or pi%2).  Thus:
> 
> sin =: 1&o. *   1p1 ~:!.0 |
> cos =: 2&o. * 0.5p1 ~:!.0 |
> re  =: 9&o.
> im  =: 11&o.
> mexp=: ^...@re * (cos j. sin)@im
> 
> exp =: mexp : (mexp@(^...@[ * ]))
> 
>    2 exp 3
> 8
>   
>    1j1 exp 2
> 0j2
>    0j1 exp 2
> _1
>    0 = 1 + exp 0j1 * 1p1
> 1
>    exp _24
> 3.77513e_11
> 
> hex  =: {:@(2&(3!:3))"0
> unhex=: 3!:2@((}:2(3!:3) 1p1)&,)"1
> 
>    sin 1p1 _1p1
> 0 0
>    hex 1p1
> 400921fb54442d18
>    sin unhex (}:hex 1p1),"1 0 '79'
> 5.6655e_16 _3.21629e_16
> 
>    cos 0.5p1 _0.5p1
> 0 0
>    hex 0.5p1
> 3ff921fb54442d18
>    cos unhex (}:hex 0.5p1),"1 0 '79'
> 2.83275e_16 _1.60814e_16
> 
> 
> 
> ----- Original Message -----
> From: Kip Murray <[email protected]>
> Date: Friday, May 22, 2009 18:54
> Subject: Re: [Jchat] Clean elementary functions?
> To: Chat forum <[email protected]>
> 
> >     NB. Here is a model for ^ that has 0 = 1 + ^ 
> > 0j1*1p1
> >     load 'numeric'
> > 
> >     cos =: clean@(2&o.)
> > 
> >     sin =: clean@(1&o.)
> > 
> >     mexp =:  3 : 0
> > 'u v' =. +. y
> > (^u)*(cos v)+0j1*sin v
> > )
> > 
> >     exp =: 3 : 0
> > mexp y
> > :
> > mexp y * ^. x
> > )
> > 
> >     i =: 0j1
> > 
> >     pi =: 1p1
> > 
> >     2 exp 3
> > 8
> >     i exp 2
> > _1
> >     0 = 1 + exp i*pi
> > 1
> >     exp _24
> > 3.77513e_11
> > 
> >     NB. That is, exp x remains positive for real x
> > 
> > Kip Murray
> > 
> > 
> > Kip Murray wrote:
> > > This is great!  /Kip
> > > 
> > > 
> > > Roger Hui wrote:
> > >> In J6.03:
> > >>
> > >>    0j1 ^ i.5 4
> > >> 1 0j1 _1 0j_1
> > >> 1 0j1 _1 0j_1
> > >> 1 0j1 _1 0j_1
> > >> 1 0j1 _1 0j_1
> > >> 1 0j1 _1 0j_1
> > >>
> > >>
> > >>
> > >> ----- Original Message -----
> > >> From: Roger Hui <[email protected]>
> > >> Date: Thursday, May 21, 2009 17:46
> > >> Subject: Re: [Jchat] Clean elementary functions?
> > >> To: Chat forum <[email protected]>
> > >>
> > >>> I am in sympathy with your concern.
> > >>> A solution in the particular case of z^n is to do
> > >>> repeated squaring instead of ^n*^.z .
> > >>> The interpreter already does that for real z .
> > >>>
> > >>>
> > >>>
> > >>> ----- Original Message -----
> > >>> From: Kip Murray <[email protected]>
> > >>> Date: Thursday, May 21, 2009 15:48
> > >>> Subject: [Jchat] Clean elementary functions?
> > >>> To: Chat forum <[email protected]>
> > >>>
> > >>>> Caution, rant follows.  /Kip Murray
> > >>>>
> > >>>>
> > >>>>     NB. It is too bad that whereas
> > >>>>
> > >>>>     0j1*0j1
> > >>>> _1
> > >>>>
> > >>>>     NB. and
> > >>>>
> > >>>>     *:0j1
> > >>>> _1
> > >>>>
> > >>>>     NB. we get
> > >>>>
> > >>>>     0j1^2
> > >>>> _1j1.22465e_16
> > >>>>
> > >>>>
> > >>>>     NB. The culprit appears to be
> > >>>>
> > >>>>     1 o. o. 1
> > >>>> 1.22465e_16
> > >>>>
> > >>>>
> > >>>>     NB. because 0j1^2 is calculated as
> > >>>>
> > >>>>     ^ 2 * ^. 0j1
> > >>>> _1j1.22465e_16
> > >>>>
> > >>>>     NB. which has real part
> > >>>>
> > >>>>     2 o. o. 1
> > >>>> _1
> > >>>>
> > >>>>     NB. and imaginary part
> > >>>>
> > >>>>     1 o. o. 1
> > >>>> 1.22465e_16
> > >>>>
> > >>>>     NB. Sometimes I think verb "clean" 
> > should be incorporated    NB. 
> > >>>> in the elementary functions!  Maybe just in 1&o. and 2&o.
> > >>>>     NB. The TI-83 calculator gives 
> > "clean" results for i^2 and e^(i 
> > >>>> pi).
> > >>>>
> > >>>>     load 'numeric'
> > >>>>
> > >>>>     clean 0j1^2
> > >>>> _1
> > >>>>
> > >>>>     clean ^ 0j1 * 1p1
> > >>>> _1
> > >>>>
> > >>>>     0j1^2
> > >>>> _1j1.22465e_16
> > >>>>
> > >>>>     ^ 0j1 * 1p1
> > >>>> _1j1.22465e_16
> > >>>>
> > >>>>     clean
> > >>>> 1e_10&$: :(4 : 0)
> > >>>> if. L. y do.
> > >>>>    x clean each y
> > >>>> else.
> > >>>>    if. (3!:0 y) e. 16 16384 do.
> > >>>>      j./"1 y * x <: | y=. +.y
> > >>>>    else.
> > >>>>      y * x <: |y
> > >>>>    end.
> > >>>> end.
> > >>>> )
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to