It seems to me that the documentation of R's complex class & R's atan function 
do not tell us what to expect, so (as others have suggested), some additional 
notes are needed. I think that mathematically atan(1i) should be NA_complex_, 
but R seems not to use any mathematically standard compactification of the 
complex plane (and I'm not sure that IEEE does either).

Incidentally, the signature of the complex constructor is confusing. 
complex(1L) returns zero, but complex(1L, argument=theta) is an element of the 
unit circle. The defaults suggest ambiguous results in case only length.out is 
specified, and you have to read a parenthesis in the details to figure out what 
will happen. Even then, the behaviour in my example is not spelled out 
(although it is suggested by negative inference). Moreover, the real & 
imaginary parts are ignored if either modulus or argument is provided, and I 
don't see that this is explained at all.

R's numeric (& IEEE's floating-point types) seem to approximate a multi-point 
compactification of the real line. +Inf & -Inf fill out the approximation to 
the extended real line, and NaN, NA_real_ & maybe some others handle some cases 
in which the answer does not live in the extended real line. (I'm not digging 
into bit patterns here. I suspect that there are several versions of NaN, but I 
hope that they all behave the same way.) The documentation suggests that a 
complex scalar in R is just a pair of numeric scalars, so we are not dealing 
with the Riemann sphere or any other usually-studied extension of the complex 
plane. Since R distinguishes various complex infinities (and seems to allow any 
combination of numeric values in real & imaginary parts), the usual 
mathematical answer for atan(1i) may no longer be relevant.

The tangent function has an essential singularity at complex infinity (the 
compactification point in the Riemann sphere, which I consider the natural 
extension for the study of meromorphic functions, for example making the 
tangent function well defined on the whole plane), so the usual extension of 
the plane does not give us an answer for atan(1i). However, another possible 
extension is the Cartesian square of the extended real line, and in that 
extension continuity suggests that tan(x + Inf*1i) = 1i and tan(x - Inf*1i) = 
-1i (for x real & finite). That is the result from R's tan function, and it 
explains why atan(1i) in R is not NA or NaN. The specific choice of pi/4 + 
Inf*1i puzzled me at first, but I think it's related to the branch-cut rules 
given in the documentation. The real part of atan((1+.Machine$double.eps)*1i) 
is pi/2, and the real part of atan((1-.Machine$double.eps)*1i) is zero, and 
someone apparently decided to average those for atan(1i).

TL;DR: The documentation needs more details, and I don't really like the 
extended complex plane that R implemented, but within that framework the 
answers for atan(1i) & atan(-1i) make sense.

Regards,
Jorgen Harmse.





        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to