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