Trigonometric functions: Difference between revisions

From Rosetta Code
Content added Content deleted
(added c)
(+D)
Line 118: Line 118:
0.785398 45.000000
0.785398 45.000000
</pre>
</pre>
=={{header|D}}==

{{trans|C}}
<d>import std.stdio, std.math ;
int main() {
double Pi = 4.0 * atan(1.0); // in D math module, PI is a _real_ constant of π
/*Pi / 4 is 45 degrees. All answers should be the same.*/
double radians = Pi / 4.0;
double degrees = 45.0;
double temp;
/*sine*/
writef("%f %f\n", sin(radians), sin(degrees * Pi / 180.0));
/*cosine*/
writef("%f %f\n", cos(radians), cos(degrees * Pi / 180.0));
/*tangent*/
writef("%f %f\n", tan(radians), tan(degrees * Pi / 180.0));
/*arcsine*/
temp = asin(sin(radians));
writef("%f %f\n", temp, temp * 180.0 / Pi);
/*arccosine*/
temp = acos(cos(radians));
writef("%f %f\n", temp, temp * 180.0 / Pi);
/*arctangent*/
temp = atan(tan(radians));
writef("%f %f\n", temp, temp * 180.0 / Pi);
return 0;
}</d>
=={{header|Forth}}==
=={{header|Forth}}==
45e pi f* 180e f/ \ radians
45e pi f* 180e f/ \ radians

Revision as of 10:34, 14 April 2008

Task
Trigonometric functions
You are encouraged to solve this task according to the task description, using any language you may know.

If your language has a library or built-in functions for trigonometry, show examples of sine, cosine, tangent, and their inverses using the same angle in radians and degrees. For the non-inverse functions, each radian/degree pair should use arguments that evaluate to the same angle (that is, it's not necessary to use the same angle for all three regular functions as long as the two sine calls use the same angle). For the inverse functions, use the same number and convert its answer to radians and degrees. If your language does not have trigonometric functions available or only has some available, write functions to calculate the functions based on any known approximation or identity.

Ada

Ada provides library trig functions which default to radians along with corresponding library functions for which the cycle can be specified. The examples below specify the cycle for degrees and for radians. The output of the inverse trig functions is in units of the specified cycle (degrees or radians).

with Ada.Numerics.Elementary_Functions;
use Ada.Numerics.Elementary_Functions;
with Ada.Float_Text_Io; use Ada.Float_Text_Io;
with Ada.Text_Io; use Ada.Text_Io;

procedure Trig is
   Degrees_Cycle : constant Float := 360.0;
   Radians_Cycle : constant Float := 2.0 * Ada.Numerics.Pi;
   Angle_Degrees : constant Float := 45.0;
   Angle_Radians : constant Float := Ada.Numerics.Pi / 4.0;
begin
   Put(Item => Sin(Angle_Degrees, Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Sin(Angle_Radians, Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Cos(Angle_Degrees, Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Cos(Angle_Radians, Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Tan(Angle_Degrees, Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Tan(Angle_Radians, Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Cot(Angle_Degrees, Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Cot(Angle_Radians, Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => ArcSin(Sin(Angle_Degrees, Degrees_Cycle), Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => ArcSin(Sin(Angle_Radians, Radians_Cycle), Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Arccos(Cos(Angle_Degrees, Degrees_Cycle), Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Arccos(Cos(Angle_Radians, Radians_Cycle), Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Arctan(Y => Tan(Angle_Degrees, Degrees_Cycle), Cycle => Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Arctan(Y => Tan(Angle_Radians, Radians_Cycle), Cycle => Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
   Put(Item => Arccot(X => Cot(Angle_Degrees, Degrees_Cycle), Cycle => Degrees_Cycle), Aft => 5, Exp => 0);
   Put(" ");
   Put(Item => Arccot(X => Cot(Angle_Degrees, Degrees_Cycle), Cycle => Radians_Cycle), Aft => 5, Exp => 0);
   New_Line;
end Trig;

Output:

 0.70711  0.70711
 0.70711  0.70711
 1.00000  1.00000
 1.00000  1.00000
45.00000  0.78540
45.00000  0.78540
45.00000  0.78540
45.00000  0.78540

BASIC

Works with: QuickBasic version 4.5

QuickBasic 4.5 does not have arcsin and arccos built in. They are defined by identities found here.

pi = 3.141592653589793#
radians = pi / 4 'a.k.a. 45 degrees
degrees = 45 * pi / 180 'convert 45 degrees to radians once
PRINT SIN(radians) + " " + SIN(degrees) 'sine
PRINT COS(radians) + " " + COS(degrees) 'cosine
PRINT TAN(radians) + " " + TAN (degrees) 'tangent
'arcsin
arcsin = 2 * ATN(SIN(radians)) * radians / (1 + SQR(1 - radians ^ 2))
PRINT arcsin + " " + arcsin * 180 / pi
'arccos
arccos = 2 * ATN(COS(radians)) * SQR(1 - radians ^ 2) / (1 + radians)
PRINT arccos + " " + arccos * 180 / pi
PRINT ATN(TAN(radians)) + " " + ATN(TAN(radians)) * 180 / pi 'arctan

C

<c>#include <math.h>

  1. include <stdio.h>

int main() {

 double pi = 4 * atan(1);
 /*Pi / 4 is 45 degrees. All answers should be the same.*/
 double radians = pi / 4;
 double degrees = 45.0;
 double temp;
 /*sine*/
 printf("%f %f\n", sin(radians), sin(degrees * pi / 180));
 /*cosine*/
 printf("%f %f\n", cos(radians), cos(degrees * pi / 180));
 /*tangent*/
 printf("%f %f\n", tan(radians), tan(degrees * pi / 180));
 /*arcsine*/
 temp = asin(sin(radians));
 printf("%f %f\n", temp, temp * 180 / pi);
 /*arccosine*/
 temp = acos(cos(radians));
 printf("%f %f\n", temp, temp * 180 / pi);
 /*arctangent*/
 temp = atan(tan(radians));
 printf("%f %f\n", temp, temp * 180 / pi);
 return 0;

}</c>

Output:

0.707107 0.707107
0.707107 0.707107
1.000000 1.000000
0.785398 45.000000
0.785398 45.000000
0.785398 45.000000

D

Translation of: C

<d>import std.stdio, std.math ;

int main() {

 double Pi = 4.0 * atan(1.0); // in D math module, PI is a _real_ constant of π
 /*Pi / 4 is 45 degrees. All answers should be the same.*/
 double radians = Pi / 4.0;
 double degrees = 45.0;
 double temp;
 /*sine*/
 writef("%f %f\n", sin(radians), sin(degrees * Pi / 180.0));
 /*cosine*/
 writef("%f %f\n", cos(radians), cos(degrees * Pi / 180.0));
 /*tangent*/
 writef("%f %f\n", tan(radians), tan(degrees * Pi / 180.0));
 /*arcsine*/
 temp = asin(sin(radians));
 writef("%f %f\n", temp, temp * 180.0 / Pi);
 /*arccosine*/
 temp = acos(cos(radians));
 writef("%f %f\n", temp, temp * 180.0 / Pi);
 /*arctangent*/
 temp = atan(tan(radians));
 writef("%f %f\n", temp, temp * 180.0 / Pi);

 return 0;

}</d>

Forth

45e  pi f* 180e f/	\ radians

cr fdup  fsin f.	\ also available: fsincos ( r -- sin cos )
cr fdup  fcos f.
cr fdup  ftan f.
cr fdup fasin f.
cr fdup facos f.
cr      fatan f.	\ also available: fatan2 ( r1 r2 -- atan[r1/r2] )

Haskell

Trigonometric functions use radians; degrees require conversion.

fromDegrees deg = deg * pi / 180 
toDegrees   rad = rad * 180 / pi

example = [
  sin (pi / 6), sin (fromDegrees 30), 
  cos (pi / 6), cos (fromDegrees 30), 
  tan (pi / 6), tan (fromDegrees 30), 
  asin 0.5, toDegrees (asin 0.5),
  acos 0.5, toDegrees (acos 0.5),
  atan 0.5, toDegrees (atan 0.5)]

J

The circle functions in J include trigonometric functions. Native operation is in radians, so values in degrees involve conversion.

Sine, cosine, and tangent of a single angle, indicated as pi-over-four radians and as 45 degrees:

   >,:(1&o. ; 2&o. ; 3&o.) (4%~o. 1), 180%~o. 45
0.707107 0.707107
0.707107 0.707107
       1        1

Arcsine, arccosine, and arctangent of one-half, in radians and degrees:

   >,:([ , 180p_1&*)&.> (_1&o. ; _2&o. ; _3&o.) 0.5
0.523599      30
  1.0472      60
0.463648 26.5651

Java

Java's Math class contains all six functions and is automatically included as part of the language. The functions all accept radians only, so conversion is necessary when dealing with degrees. The Math class also has a PI constant for easy conversion.

<java>public class Trig { public static void main(String[] args) { //Pi / 4 is 45 degrees. All answers should be the same. double radians = Math.PI / 4; double degrees = 45.0; //sine System.out.println(Math.sin(radians) + " " + Math.sin(Math.toRadians(degrees))); //cosine System.out.println(Math.cos(radians) + " " + Math.cos(Math.toRadians(degrees))); //tangent System.out.println(Math.tan(radians) + " " + Math.tan(Math.toRadians(degrees))); //arcsine double arcsin = Math.asin(Math.sin(radians)); System.out.println(arcsin + " " + Math.toDegrees(arcsin)); //arccosine double arccos = Math.acos(Math.cos(radians)); System.out.println(arccos + " " + Math.toDegrees(arccos)); //arctangent double arctan = Math.atan(Math.tan(radians)); System.out.println(arctan + " " + Math.toDegrees(arctan)); } }</java>

Output:

0.7071067811865475 0.7071067811865475
0.7071067811865476 0.7071067811865476
0.9999999999999999 0.9999999999999999
0.7853981633974482 44.99999999999999
0.7853981633974483 45.0
0.7853981633974483 45.0

OCaml

OCaml's preloaded Pervasives modules contains all six functions. The functions all accept radians only, so conversion is necessary when dealing with degrees.

let pi = 4. *. atan 1.

let radians = pi /. 4.
let degrees = 45.

let () =
  Printf.printf "%f %f\n" (sin radians) (sin (degrees *. pi /. 180.));
  Printf.printf "%f %f\n" (cos radians) (cos (degrees *. pi /. 180.));
  Printf.printf "%f %f\n" (tan radians) (tan (degrees *. pi /. 180.));
  let arcsin = asin (sin radians)
  and arccos = acos (cos radians)
  and arctan = atan (tan radians) in
  Printf.printf "%f %f\n" arcsin (arcsin *. 180. /. pi);
  Printf.printf "%f %f\n" arccos (arccos *. 180. /. pi);
  Printf.printf "%f %f\n" arctan (arctan *. 180. /. pi)

Output:

0.707107 0.707107
0.707107 0.707107
1.000000 1.000000
0.785398 45.000000
0.785398 45.000000
0.785398 45.000000

Perl

Works with: Perl version 5.8.8
use Math::Trig;

$angle_degrees = 45;
$angle_radians = pi / 4;

print sin($angle_radians).' '.sin(deg2rad($angle_degrees))."\n";
print cos($angle_radians).' '.cos(deg2rad($angle_degrees))."\n";
print tan($angle_radians).' '.tan(deg2rad($angle_degrees))."\n";
print cot($angle_radians).' '.cot(deg2rad($angle_degrees))."\n";
$asin = asin(sin($angle_radians));
print $asin.' '.rad2deg($asin)."\n";
$acos = acos(cos($angle_radians));
print $acos.' '.rad2deg($acos)."\n";
$atan = atan(tan($angle_radians));
print $atan.' '.rad2deg($atan)."\n";
$acot = acot(cot($angle_radians));
print $acot.' '.rad2deg($acot)."\n";

Output:

0.707106781186547 0.707106781186547
0.707106781186548 0.707106781186548
1 1
1 1
0.785398163397448 45
0.785398163397448 45
0.785398163397448 45
0.785398163397448 45