> atan(0,0) is not well-defined (more precisely, there is no unique choice 
> within the interval [0,360°)) - if the point (0,0) is written in polar 
> coordinates (0*cos theta, 0*sin theta), then any angle theta can be used.
> 
> 
> If you intend to support (arctan2 0 0), it may be good to mention that in the 
> docstring, and make sure it is in {0,180,-180} to match IEEE, and add a test 
> for x=y=0.

Right, I've documented and tested that it returns 0 for (arctan2 0 0).

> 
> 
> I'm not sure, but I think the inexact +0.0 and -0.0 is counted as 'zero?', 
> which might not be what you want it to do here. Being an inexact input 
> (representing a number near 0 but not necessarily exactly 0), and since 
> 'atan2' is not locally constant at 0, the output would need to be inexact 
> too. Or, maybe you could let it return something exact anyways, idk. 
> Exactness/inexactness considerations can become a bit arbitrary sometimes - 
> sometimes '+0.0' is _exactly_ positive zero).

I'll stick with keeping the result exact, I don't think there's much else that 
can be inferred when the number is zero but inexact.

> 
> 
> If you consider signed infinity to simply be the exact signed infinity, you 
> could also make (atan2 some-signed-infinity x) and (atan2 y 
> some-signed-infinity) exact. (If it instead is considered inexact, as in 
> maybe exact signed infinity, maybe a very large value, then this doesn't 
> follow).

atan2 doesn't do anything special for now, I'm not 100% sure how much of an 
improvement it would be to specifically handle infinity values.

> 
> 
> In the new tests, it appears that you are only testing whether the values 
> (approximately) match, and not whether return values are exact where they can 
> be. Perhaps you could modify 'within-margin?' to do an exactness check when 
> the reference value is exact?

Sure.

> 
> 
> For the tangent, tan(45°) is rational despite sin(45°) and cos(45°) being 
> irrational. So, 'tangent' needs to be adjusted. Also, you should consider 
> what to do with (tangent 45) - return +infinity or raise an exception for 
> divide-by-zero? Either way, it's something to document.

I've documented that it raises an exception for divide-by-zero.

> 
> 
> For another test, you could check that (map (arcsine sine) list-of-angles) 
> equals list-of-angles (with exact comparison whenever any of the compared 
> things is exact, and approximate if both are inexact). Likewise for (map 
> (sine arcsine) list-of-ratios). This can then easily be repeated for cosine 
> and tangent (*).
> 
> 
> (*) If 45° is included in the angles: assuming (tangent 90) returns +infinity 
> and (arctan +infinity) returns the exact 90. In case of divide-by-zero 
> exception, or (arctan +infinity) being inexact 90.0, this wouldn't work as-is.
> 
> 
>     +  (< (sqrt (expt (- value estimate) 2)) margin))
> 
> 
> That's simply (< (abs (- value estimate)) margin), no? Or does Guile not have 
> 'abs'?

Yes, I forgot that it existed. I've switched to using it in the revised patch.

Reply via email to