View mode: basic / threaded / horizontal-split · Log in · Help
April 02, 2008
Feature request: add degToRad and radToDeg to phobos / tango
Hello,

I have a suggestion for a small feature. The reason for adding these 
conversions would be to prevent mistakes and a small utilitarian gain.

real degToRad(real deg)
{
    return deg * PI / 180;
}

real radToDeg(real rad)
{
    return (180 * rad) / PI;
}


Or as Derek Parnell sugested (although I don't understand the 
operational difference here, but the top one did originally read float 
instead of real.

enum
{
   fPI_180 = PI / 180.0L;
   f180_PI = 180.0L / PI;
}

T degToRad(T)(T deg)
{
	return cast(T)(cast(real)deg * fPI_180);
}

T radToDeg(T)(T rad)
{
	return cast(T)(cast(real)rad * f180_PI);
}


Perhaps also gradToRad etc. Or gonToRad sice the gon is meant to be the 
proper ISO unit. People don't seem to use Grad much though.
April 02, 2008
Re: Feature request: add degToRad and radToDeg to phobos / tango
Spacen Jasset wrote:
> Hello,
> 
> I have a suggestion for a small feature. The reason for adding these 
> conversions would be to prevent mistakes and a small utilitarian gain.
> 
> real degToRad(real deg)
> {
>     return deg * PI / 180;
> }
> 
> real radToDeg(real rad)
> {
>     return (180 * rad) / PI;
> }

It's not that simple. The code looks OK, and works OK if rad is less than 2*PI. 
But once you get to multiple revolutions, you expose the roundoff error in PI.
The proper way to deal with this is with sinPi(), cosPi()  (they're in Tango, 
not yet in Phobos) and with modPi() which I haven't yet written, but uses a 
high-precision value of pi.

Standard libraries have a responsibility to not include code which can generate 
subtle errors. The correct code takes much longer to write. But it's coming.


> 
> 
> Or as Derek Parnell sugested (although I don't understand the 
> operational difference here, but the top one did originally read float 
> instead of real.
> 
> enum
> {
>    fPI_180 = PI / 180.0L;
>    f180_PI = 180.0L / PI;
> }
> 
> T degToRad(T)(T deg)
> {
>     return cast(T)(cast(real)deg * fPI_180);
> }
> 
> T radToDeg(T)(T rad)
> {
>     return cast(T)(cast(real)rad * f180_PI);
> }
> 
> 
> Perhaps also gradToRad etc. Or gonToRad sice the gon is meant to be the 
> proper ISO unit. People don't seem to use Grad much though.
Top | Discussion index | About this forum | D home