





 
 




 
 


On 20211017 6:40 AM (4), kurtz le pirate wrote:
>
> I have a problem with atan2(a,b) when b = zero.
>
> The documentation on the page
> <http://www.povray.org/documentation/view/3.7.1/228/> says :
>
> Arctangent of (A/B). Returns the angle, measured in radians, whose
> tangent is (A/B). **Returns appropriate value even if B is zero**
>
> In my case, i get : Parse Error: Domain error in atan2!
Is your value for A also zero?
> So it's up to me to test if b=zero and return the appropriate value ?
It seems that some people are confused about atan2().
Of course, the inverse tangent of A/0 is undefined, because A/0 is
undefined. But a simple limits exercise, as well as the very definition
of the tangent of an angle, show that these undefined tangents
correspond to the angles pi/2 and pi/2, and it is therefore useful to
pretend that they are valid.
The purpose of atan2() is to handle these special cases, by converting a
naive atan()'s argument into an ordered pair, thus allowing the wouldbe
inverse tangent of A/0 to be computed without having to divide by 0. A
simple scene file shows that the *only* time atan2() fails with a domain
error is when *both* A and B are zero. Of course, (0, 0) is an
indeterminate case, for which returning a value would be nonsensical.
[BEGIN CODE]
#version 3.7;
global_settings { assumed_gamma 1 }
#declare Args = array [9]
{ <0, 1>, <1, 1>, <1, 0>, <1, 1>, <0, 1>,
<1, 1>, <1, 0>, <1, 1>, <0, 0>,
}
#for (I, 0, 8)
#debug concat ("atan2 (", vstr (2, Args[I], ", ", 0, 0), ") = ")
#debug concat (str (atan2 (Args[I].x, Args[I].y), 0, 6), "\n")
#end
[END CODE]
This scene runs fine with the 3rd and 7th arguments; it does not halt
with a parse error until it gets to the last argument.
Perhaps "unless both A and B are zero" could be added to the documentation.
Post a reply to this message


 
 




 
 


On 17/10/2021 23:46, Cousin Ricky wrote:
> ...
> Of course, the inverse tangent of A/0 is undefined, because A/0 is
> undefined. But a simple limits exercise, as well as the very definition
> of the tangent of an angle, show that these undefined tangents
> correspond to the angles pi/2 and pi/2, and it is therefore useful to
> pretend that they are valid.
>
> The purpose of atan2() is to handle these special cases, by converting a
> naive atan()'s argument into an ordered pair, thus allowing the wouldbe
> inverse tangent of A/0 to be computed without having to divide by 0. A
> simple scene file shows that the *only* time atan2() fails with a domain
> error is when *both* A and B are zero. Of course, (0, 0) is an
> indeterminate case, for which returning a value would be nonsensical.
> ...
Cousin Ricky is right about everything!
And therefore, my problem is when A AND B are equal to zero.
Lot of datas to deal with, the debugging will be long...
(i'm working on the visualization of complex functions with domain coloring)

Kurtz le pirate
Compagnie de la Banquise
Post a reply to this message


 
 




 
 


Le 20211018 à 11:42, kurtz le pirate a écrit :
> On 17/10/2021 23:46, Cousin Ricky wrote:
>
>> ... Of course, the inverse tangent of A/0 is undefined, because A/0 is
>> undefined. But a simple limits exercise, as well as the very definition
>> of the tangent of an angle, show that these undefined tangents
>> correspond to the angles pi/2 and pi/2, and it is therefore useful to
>> pretend that they are valid.
>>
>> The purpose of atan2() is to handle these special cases, by converting a
>> naive atan()'s argument into an ordered pair, thus allowing the wouldbe
>> inverse tangent of A/0 to be computed without having to divide by 0. A
>> simple scene file shows that the *only* time atan2() fails with a domain
>> error is when *both* A and B are zero. Of course, (0, 0) is an
>> indeterminate case, for which returning a value would be nonsensical.
>> ...
>
> Cousin Ricky is right about everything!
>
> And therefore, my problem is when A AND B are equal to zero.
>
> Lot of datas to deal with, the debugging will be long...
> (i'm working on the visualization of complex functions with domain
> coloring)
>
>
>
Add a test to see if both A and B are zero, and replace that with some
small value for B. It could be something like the following just before
the call to atan2 :
#if (A=0 ! B=0) #declare B= 0.001; #end
... atan2(A,B) ...
Post a reply to this message


 
 




 

