Trigonometric functions: Difference between revisions
→{{header|AWK}}: Show how to use atan2() to calculate arcsine and arccosine. |
m →{{header|AWK}}: Typo in comment. |
||
Line 168: | Line 168: | ||
} |
} |
||
# acos( |
# acos(x) = arccosine of x, domain [-1, 1], range [0, pi] |
||
function acos(x) { |
function acos(x) { |
||
return atan2(sqrt(1 - x * x), x) |
return atan2(sqrt(1 - x * x), x) |
Revision as of 04:29, 3 March 2011
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.
ActionScript
Actionscript supports basic trigonometric and inverse trigonometric functions via the Math class, including the atan2 function, but not the hyperbolic functions. <lang ActionScript>trace("Radians:"); trace("sin(Pi/4) = ", Math.sin(Math.PI/4)); trace("cos(Pi/4) = ", Math.cos(Math.PI/4)); trace("tan(Pi/4) = ", Math.tan(Math.PI/4)); trace("arcsin(0.5) = ", Math.asin(0.5)); trace("arccos(0.5) = ", Math.acos(0.5)); trace("arctan(0.5) = ", Math.atan(0.5)); trace("arctan2(-1,-2) = ", Math.atan2(-1,-2)); trace("\nDegrees") trace("sin(45) = ", Math.sin(45 * Math.PI/180)); trace("cos(45) = ", Math.cos(45 * Math.PI/180)); trace("tan(45) = ", Math.tan(45 * Math.PI/180)); trace("arcsin(0.5) = ", Math.asin(0.5)*180/Math.PI); trace("arccos(0.5) = ", Math.acos(0.5)*180/Math.PI); trace("arctan(0.5) = ", Math.atan(0.5)*180/Math.PI); trace("arctan2(-1,-2) = ", Math.atan2(-1,-2)*180/Math.PI); </lang>
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). <lang ada>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; procedure Put (V1, V2 : Float) is begin Put (V1, Aft => 5, Exp => 0); Put (" "); Put (V2, Aft => 5, Exp => 0); New_Line; end Put;
begin
Put (Sin (Angle_Degrees, Degrees_Cycle), Sin (Angle_Radians, Radians_Cycle)); Put (Cos (Angle_Degrees, Degrees_Cycle), Cos (Angle_Radians, Radians_Cycle)); Put (Tan (Angle_Degrees, Degrees_Cycle), Tan (Angle_Radians, Radians_Cycle)); Put (Cot (Angle_Degrees, Degrees_Cycle), Cot (Angle_Radians, Radians_Cycle)); Put (ArcSin (Sin (Angle_Degrees, Degrees_Cycle), Degrees_Cycle), ArcSin (Sin (Angle_Radians, Radians_Cycle), Radians_Cycle)); Put (Arccos (Cos (Angle_Degrees, Degrees_Cycle), Degrees_Cycle), Arccos (Cos (Angle_Radians, Radians_Cycle), Radians_Cycle)); Put (Arctan (Y => Tan (Angle_Degrees, Degrees_Cycle)), Arctan (Y => Tan (Angle_Radians, Radians_Cycle))); Put (Arccot (X => Cot (Angle_Degrees, Degrees_Cycle)), Arccot (X => Cot (Angle_Degrees, Degrees_Cycle)));
end Trig;</lang>
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
ALGOL 68
<lang algol68>main:(
REAL pi = 4 * arc tan(1); # Pi / 4 is 45 degrees. All answers should be the same. # REAL radians = pi / 4; REAL degrees = 45.0; REAL temp; # sine # print((sin(radians), " ", sin(degrees * pi / 180), new line)); # cosine # print((cos(radians), " ", cos(degrees * pi / 180), new line)); # tangent # print((tan(radians), " ", tan(degrees * pi / 180), new line)); # arcsine # temp := arc sin(sin(radians)); print((temp, " ", temp * 180 / pi, new line)); # arccosine # temp := arc cos(cos(radians)); print((temp, " ", temp * 180 / pi, new line)); # arctangent # temp := arc tan(tan(radians)); print((temp, " ", temp * 180 / pi, new line))
)</lang> Output:
+.707106781186548e +0 +.707106781186548e +0 +.707106781186548e +0 +.707106781186548e +0 +.100000000000000e +1 +.100000000000000e +1 +.785398163397448e +0 +.450000000000000e +2 +.785398163397448e +0 +.450000000000000e +2 +.785398163397448e +0 +.450000000000000e +2
AutoHotkey
<lang AutoHotkey>pi := 4 * atan(1)
radians := pi / 4 degrees := 45.0 result .= "`n" . sin(radians) . " " . sin(degrees * pi / 180) result .= "`n" . cos(radians) . " " . cos(degrees * pi / 180) result .= "`n" . tan(radians) . " " . tan(degrees * pi / 180)
temp := asin(sin(radians)) result .= "`n" . temp . " " . temp * 180 / pi
temp := acos(cos(radians)) result .= "`n" . temp . " " . temp * 180 / pi
temp := atan(tan(radians)) result .= "`n" . temp . " " . temp * 180 / pi
msgbox % result /* output
trig.ahk
0.707107 0.707107 0.707107 0.707107 1.000000 1.000000 0.785398 45.000000 0.785398 45.000000 0.785398 45.000000
- /</lang>
AWK
Awk only provides sin(), cos() and atan2(), the three bare necessities for trigonometry. They all use radians. To calculate the other functions, we use these three trigonometric identities:
tangent | arcsine | arccosine |
---|---|---|
With the magic of atan2(), arcsine of y is just atan2(y, sqrt(1 - y * y)), and arccosine of x is just atan2(sqrt(1 - x * x), x). This magic handles the angles arcsin(-1), arcsin 1 and arccos 0 that have no tangent. This magic also picks the angle in the correct range, so arccos(-1/2) is 2*pi/3 and not some wrong answer like -pi/3 (though tan(2*pi/3) = tan(-pi/3) = -sqrt(3).)
atan2(y, x) actually computes the angle of the point (x, y), in the range [-pi, pi]. When x > 0, this angle is the principle arctangent of y/x, in the range (-pi/2, pi/2). The calculations for arcsine and arccosine use points on the unit circle at x2 + y2 = 1. To calculate arcsine in the range [-pi/2, pi/2], we take the angle of points on the half-circle x = sqrt(1 - y2). To calculate arccosine in the range [0, pi], we take the angle of points on the half-circle y = sqrt(1 - x2).
<lang awk># tan(x) = tangent of x function tan(x) { return sin(x) / cos(x) }
- asin(y) = arcsine of y, domain [-1, 1], range [-pi/2, pi/2]
function asin(y) { return atan2(y, sqrt(1 - y * y)) }
- acos(x) = arccosine of x, domain [-1, 1], range [0, pi]
function acos(x) { return atan2(sqrt(1 - x * x), x) }
- atan(y) = arctangent of y, range (-pi/2, pi/2)
function atan(y) { return atan2(y, 1) }
BEGIN { pi = atan2(0, -1) degrees = pi / 180
print "Using radians:" print " sin(-pi / 6) =", sin(-pi / 6) print " cos(3 * pi / 4) =", cos(3 * pi / 4) print " tan(pi / 3) =", tan(pi / 3) print " asin(-1 / 2) =", asin(-1 / 2) print " acos(-sqrt(2) / 2) =", acos(-sqrt(2) / 2) print " atan(sqrt(3)) =", atan(sqrt(3))
print "Using degrees:" print " sin(-30) =", sin(-30 * degrees) print " cos(135) =", cos(135 * degrees) print " tan(60) =", tan(60 * degrees) print " asin(-1 / 2) =", asin(-1 / 2) / degrees print " acos(-sqrt(2) / 2) =", acos(-sqrt(2) / 2) / degrees print " atan(sqrt(3)) =", atan(sqrt(3)) / degrees }</lang>
Output:
Using radians: sin(-pi / 6) = -0.5 cos(3 * pi / 4) = -0.707107 tan(pi / 3) = 1.73205 asin(-1 / 2) = -0.523599 acos(-sqrt(2) / 2) = 2.35619 atan(sqrt(3)) = 1.0472 Using degrees: sin(-30) = -0.5 cos(135) = -0.707107 tan(60) = 1.73205 asin(-1 / 2) = -30 acos(-sqrt(2) / 2) = 135 atan(sqrt(3)) = 60
BASIC
QuickBasic 4.5 does not have arcsin and arccos built in. They are defined by identities found here. <lang qbasic>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 thesin = SIN(radians) arcsin = ATN(thesin / SQR(1 - thesin ^ 2)) PRINT arcsin + " " + arcsin * 180 / pi 'arccos thecos = COS(radians) arccos = 2 * ATN(SQR(1 - thecos ^ 2) / (1 + thecos)) PRINT arccos + " " + arccos * 180 / pi PRINT ATN(TAN(radians)) + " " + ATN(TAN(radians)) * 180 / pi 'arctan</lang>
C
<lang c>#include <math.h>
- 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;
}</lang>
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
C++
<lang cpp>#include <iostream>
- include <cmath>
- ifdef M_PI // defined by all POSIX systems and some non-POSIX ones
double const pi = M_PI;
- else
double const pi = 4*std::atan(1);
- endif
double const degree = pi/180;
int main() {
std::cout << "=== radians ===\n"; std::cout << "sin(pi/3) = " << std::sin(pi/3) << "\n"; std::cout << "cos(pi/3) = " << std::cos(pi/3) << "\n"; std::cout << "tan(pi/3) = " << std::tan(pi/3) << "\n"; std::cout << "arcsin(1/2) = " << std::asin(0.5) << "\n"; std::cout << "arccos(1/2) = " << std::acos(0.5) << "\n"; std::cout << "arctan(1/2) = " << std::atan(0.5) << "\n";
std::cout << "\n=== degrees ===\n"; std::cout << "sin(60°) = " << std::sin(60*degree) << "\n"; std::cout << "cos(60°) = " << std::cos(60*degree) << "\n"; std::cout << "tan(60°) = " << std::tan(60*degree) << "\n"; std::cout << "arcsin(1/2) = " << std::asin(0.5)/degree << "°\n"; std::cout << "arccos(1/2) = " << std::acos(0.5)/degree << "°\n"; std::cout << "arctan(1/2) = " << std::atan(0.5)/degree << "°\n";
return 0;
}</lang>
C#
<lang csharp>using System;
namespace RosettaCode {
class Program { static void Main(string[] args) { Console.WriteLine("=== radians ==="); Console.WriteLine("sin (pi/3) = {0}", Math.Sin(Math.PI / 3)); Console.WriteLine("cos (pi/3) = {0}", Math.Cos(Math.PI / 3)); Console.WriteLine("tan (pi/3) = {0}", Math.Tan(Math.PI / 3)); Console.WriteLine("arcsin (1/2) = {0}", Math.Asin(0.5)); Console.WriteLine("arccos (1/2) = {0}", Math.Acos(0.5)); Console.WriteLine("arctan (1/2) = {0}", Math.Atan(0.5)); Console.WriteLine(""); Console.WriteLine("=== degrees ==="); Console.WriteLine("sin (60) = {0}", Math.Sin(60 * Math.PI / 180)); Console.WriteLine("cos (60) = {0}", Math.Cos(60 * Math.PI / 180)); Console.WriteLine("tan (60) = {0}", Math.Tan(60 * Math.PI / 180)); Console.WriteLine("arcsin (1/2) = {0}", Math.Asin(0.5) * 180/ Math.PI); Console.WriteLine("arccos (1/2) = {0}", Math.Acos(0.5) * 180 / Math.PI); Console.WriteLine("arctan (1/2) = {0}", Math.Atan(0.5) * 180 / Math.PI);
Console.ReadLine(); } }
}</lang>
Clojure
<lang lisp>(ns user
(:require [clojure.contrib.generic.math-functions :as generic]))
- (def pi Math/PI)
(def pi (* 4 (atan 1))) (def dtor (/ pi 180)) (def rtod (/ 180 pi)) (def radians (/ pi 4)) (def degrees 45)
(println (str (sin radians) " " (sin (* degrees dtor)))) (println (str (cos radians) " " (cos (* degrees dtor)))) (println (str (tan radians) " " (tan (* degrees dtor)))) (println (str (asin (sin radians) ) " " (* (asin (sin (* degrees dtor))) rtod))) (println (str (acos (cos radians) ) " " (* (acos (cos (* degrees dtor))) rtod))) (println (str (atan (tan radians) ) " " (* (atan (tan (* degrees dtor))) rtod)))</lang>
Output: (matches that of Java)
0.7071067811865475 0.7071067811865475 0.7071067811865476 0.7071067811865476 0.9999999999999999 0.9999999999999999 0.7853981633974482 44.99999999999999 0.7853981633974483 45.0 0.7853981633974483 45.0
Common Lisp
<lang lisp>(defun deg->rad (x) (* x (/ pi 180))) (defun rad->deg (x) (* x (/ 180 pi)))
(mapc (lambda (x) (format t "~s => ~s~%" x (eval x)))
'((sin (/ pi 4)) (sin (deg->rad 45)) (cos (/ pi 6)) (cos (deg->rad 30)) (tan (/ pi 3)) (tan (deg->rad 60)) (asin 1) (rad->deg (asin 1)) (acos 1/2) (rad->deg (acos 1/2)) (atan 15) (rad->deg (atan 15))))</lang>
D
<lang d>import std.stdio, std.math;
void main() {
enum real degrees = 45.0; enum real t0 = degrees * PI / 180.0; writeln("Reference: 0.7071067811865475244008"); writefln("Sine: %.20f %.20f", sin(PI_4), sin(t0)); writefln("Cosine: %.20f %.20f", cos(PI_4), cos(t0)); writefln("Tangent: %.20f %.20f", tan(PI_4), tan(t0));
writeln(); writeln("Reference: 0.7853981633974483096156"); immutable real t1 = asin(sin(PI_4)); writefln("Arcsine: %.20f %.20f", t1, t1 * 180.0 / PI);
immutable real t2 = acos(cos(PI_4)); writefln("Arccosine: %.20f %.20f", t2, t2 * 180.0 / PI);
immutable real t3 = atan(tan(PI_4)); writefln("Arctangent: %.20f %.20f", t3, t3 * 180.0 / PI);
}</lang> Output:
Reference: 0.7071067811865475244008 Sine: 0.70710678118654752442 0.70710678118654752442 Cosine: 0.70710678118654752438 0.70710678118654752438 Tangent: 1.00000000000000000000 1.00000000000000000000 Reference: 0.7853981633974483096156 Arcsine: 0.78539816339744830970 45.00000000000000000400 Arccosine: 0.78539816339744830961 45.00000000000000000000 Arctangent: 0.78539816339744830961 45.00000000000000000000
E
<lang e>def pi := (-1.0).acos()
def radians := pi / 4.0 def degrees := 45.0
def d2r := (pi/180).multiply def r2d := (180/pi).multiply
println(`$\ ${radians.sin()} ${d2r(degrees).sin()} ${radians.cos()} ${d2r(degrees).cos()} ${radians.tan()} ${d2r(degrees).tan()} ${def asin := radians.sin().asin()} ${r2d(asin)} ${def acos := radians.cos().acos()} ${r2d(acos)} ${def atan := radians.tan().atan()} ${r2d(atan)} `)</lang>
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
Fantom
Fantom's Float library includes all six trigonometric functions, which assume the number is in radians. Methods are provided to convert: toDegrees and toRadians.
<lang fantom> class Main {
public static Void main () { Float r := Float.pi / 4 echo (r.sin) echo (r.cos) echo (r.tan) echo (r.asin) echo (r.acos) echo (r.atan) // and from degrees echo (45.0f.toRadians.sin) echo (45.0f.toRadians.cos) echo (45.0f.toRadians.tan) echo (45.0f.toRadians.asin) echo (45.0f.toRadians.acos) echo (45.0f.toRadians.atan) }
} </lang>
Forth
<lang 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] )</lang>
Fortran
Trigonometic functions expect arguments in radians so degrees require conversion <lang fortran>PROGRAM Trig
REAL pi, dtor, rtod, radians, degrees pi = 4.0 * ATAN(1.0) dtor = pi / 180.0 rtod = 180.0 / pi radians = pi / 4.0 degrees = 45.0 WRITE(*,*) SIN(radians), SIN(degrees*dtor) WRITE(*,*) COS(radians), COS(degrees*dtor) WRITE(*,*) TAN(radians), TAN(degrees*dtor) WRITE(*,*) ASIN(SIN(radians)), ASIN(SIN(degrees*dtor))*rtod WRITE(*,*) ACOS(COS(radians)), ACOS(COS(degrees*dtor))*rtod WRITE(*,*) ATAN(TAN(radians)), ATAN(TAN(degrees*dtor))*rtod
END PROGRAM Trig</lang> Output:
0.707107 0.707107 0.707107 0.707107 1.00000 1.00000 0.785398 45.0000 0.785398 45.0000 0.785398 45.0000
The following trigonometric functions are also available <lang fortran>ATAN2(y,x) ! Arctangent(y/x), -pi < result <= +pi SINH(x) ! Hyperbolic sine COSH(x) ! Hyperbolic cosine TANH(x) ! Hyperbolic tangent</lang>
Groovy
Trig functions use radians, degrees must be converted to/from radians <lang groovy>def radians = Math.PI/4 def degrees = 45
def d2r = { it*Math.PI/180 } def r2d = { it*180/Math.PI }
println "sin(\u03C0/4) = ${Math.sin(radians)} == sin(45\u00B0) = ${Math.sin(d2r(degrees))}" println "cos(\u03C0/4) = ${Math.cos(radians)} == cos(45\u00B0) = ${Math.cos(d2r(degrees))}" println "tan(\u03C0/4) = ${Math.tan(radians)} == tan(45\u00B0) = ${Math.tan(d2r(degrees))}" println "asin(\u221A2/2) = ${Math.asin(2**(-0.5))} == asin(\u221A2/2)\u00B0 = ${r2d(Math.asin(2**(-0.5)))}\u00B0" println "acos(\u221A2/2) = ${Math.acos(2**(-0.5))} == acos(\u221A2/2)\u00B0 = ${r2d(Math.acos(2**(-0.5)))}\u00B0" println "atan(1) = ${Math.atan(1)} == atan(1)\u00B0 = ${r2d(Math.atan(1))}\u00B0"</lang>
Output:
sin(π/4) = 0.7071067811865475 == sin(45°) = 0.7071067811865475 cos(π/4) = 0.7071067811865476 == cos(45°) = 0.7071067811865476 tan(π/4) = 0.9999999999999999 == tan(45°) = 0.9999999999999999 asin(√2/2) = 0.7853981633974482 == asin(√2/2)° = 44.99999999999999° acos(√2/2) = 0.7853981633974484 == acos(√2/2)° = 45.00000000000001° atan(1) = 0.7853981633974483 == atan(1)° = 45.0°
Haskell
Trigonometric functions use radians; degrees require conversion.
<lang haskell>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)]</lang>
HicEst
Translated from Fortran: <lang hicest>pi = 4.0 * ATAN(1.0) dtor = pi / 180.0 rtod = 180.0 / pi radians = pi / 4.0 degrees = 45.0
WRITE(ClipBoard) SIN(radians), SIN(degrees*dtor) WRITE(ClipBoard) COS(radians), COS(degrees*dtor) WRITE(ClipBoard) TAN(radians), TAN(degrees*dtor) WRITE(ClipBoard) ASIN(SIN(radians)), ASIN(SIN(degrees*dtor))*rtod WRITE(ClipBoard) ACOS(COS(radians)), ACOS(COS(degrees*dtor))*rtod WRITE(ClipBoard) ATAN(TAN(radians)), ATAN(TAN(degrees*dtor))*rtod</lang> <lang hicest>0.7071067812 0.7071067812 0.7071067812 0.7071067812 1 1 0.7853981634 45 0.7853981634 45 0.7853981634 45</lang> SINH, COSH, TANH, and inverses are available as well.
IDL
<lang idl>deg = 35 ; arbitrary number of degrees rad = !dtor*deg ; system variables !dtor and !radeg convert between rad and deg</lang> <lang idl>; the trig functions receive and emit radians: print, rad, sin(rad), asin(sin(rad)) print, cos(rad), acos(cos(rad)) print, tan(rad), atan(tan(rad)) ; etc
- prints the following
- 0.610865 0.573576 0.610865
- 0.819152 0.610865
- 0.700208 0.610865</lang>
<lang idl>; the hyperbolic versions exist and behave as expected: print, sinh(rad) ; etc
- outputs
- 0.649572</lang>
<lang idl>;If the input is an array, the output has the same dimensions etc as the input: x = !dpi/[[2,3],[4,5],[6,7]] ; !dpi is a read-only sysvar = 3.1415... print,sin(x)
- outputs
- 1.0000000 0.86602540
- 0.70710678 0.58778525
- 0.50000000 0.43388374</lang>
<lang idl>; the trig functions behave as expected for complex arguments: x = complex(1,2) print,sin(x)
- outputs
- ( 3.16578, 1.95960)</lang>
Icon and Unicon
Icon and Unicon trig functions 'sin', 'cos', 'tan', 'asin', 'acos', and 'atan' operate on angles expressed in radians. Conversion functions 'dtor' and 'rtod' convert between the two systems. The example below uses string invocation to construct and call the functions:
Icon
<lang Icon>invocable all procedure main()
d := 30 # degrees r := dtor(d) # convert to radians
every write(f := !["sin","cos","tan"],"(",r,")=",y := f(r)," ",fi := "a" || f,"(",y,")=",x := fi(y)," rad = ",rtod(x)," deg") end</lang>
Sample Output:
sin(0.5235987755982988)=0.4999999999999999 asin(0.4999999999999999)=0.5235987755982988 rad = 30.0 deg cos(0.5235987755982988)=0.8660254037844387 acos(0.8660254037844387)=0.5235987755982987 rad = 29.99999999999999 deg tan(0.5235987755982988)=0.5773502691896257 atan(0.5773502691896257)=0.5235987755982988 rad = 30.0 deg
Unicon
The Icon solution works in Unicon.
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: <lang j> >,:(1&o. ; 2&o. ; 3&o.) (4%~o. 1), 180%~o. 45</lang>
0.707107 0.707107 0.707107 0.707107 1 1
Arcsine, arccosine, and arctangent of one-half, in radians and degrees: <lang j> >,:([ , 180p_1&*)&.> (_1&o. ; _2&o. ; _3&o.) 0.5</lang>
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.
<lang 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)); }
}</lang>
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
JavaScript
JavaScript'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.
<lang javascript>var
radians = Math.PI / 4, // Pi / 4 is 45 degrees. All answers should be the same. degrees = 45.0, sine = Math.sin(radians), cosine = Math.cos(radians), tangent = Math.tan(radians), arcsin = Math.asin(sine), arccos = Math.acos(cosine), arctan = Math.atan(tangent);
// sine window.alert(sine + " " + Math.sin(degrees * Math.PI / 180)); // cosine window.alert(cosine + " " + Math.cos(degrees * Math.PI / 180)); // tangent window.alert(tangent + " " + Math.tan(degrees * Math.PI / 180)); // arcsine window.alert(arcsin + " " + (arcsin * 180 / Math.PI)); // arccosine window.alert(arccos + " " + (arccos * 180 / Math.PI)); // arctangent window.alert(arctan + " " + (arctan * 180 / Math.PI));</lang>
Liberty BASIC
<lang lb>' [RC] Trigonometric functions.
pi = 4 *atn( 1)
' LB works in radians. All six functions are available.
mainwin 80 16
value =45
print print " Trig. functions and their inverses." print print " Trig. for angle 45 in radians and degrees." print print , " 45 radians", "45 degrees"
print " Sin", sin( value), sin( degrees2radians( value)) print " Cos", cos( value), cos( degrees2radians( value)) print " Tan", tan( value), tan( degrees2radians( value))
print print " Inverse trig. for result =0.5"
value =0.5
print " asn", asn( value); " radians", radians2degrees( asn( value)); " degrees" print " acs", acs( value); " radians", radians2degrees( acs( value)); " degrees" print " atn", atn( value); " radians", radians2degrees( atn( value)); " degrees"
end
function radians2degrees( r)
radians2degrees =r *360 /2 /pi
end function
function degrees2radians( degrees)
degrees2radians =degrees /360 *2 *pi
end function</lang>
Logo
UCB Logo has sine, cosine, and arctangent; each having variants for degrees or radians. <lang logo>print sin 45 print cos 45 print arctan 1 make "pi (radarctan 0 1) * 2 ; based on quadrant if uses two parameters print radsin :pi / 4 print radcos :pi / 4 print 4 * radarctan 1</lang>
Lhogho has pi defined in its trigonometric functions. Otherwise the same as UCB Logo.
<lang logo>print sin 45
print cos 45
print arctan 1
print radsin pi / 4
print radcos pi / 4
print 4 * radarctan 1</lang>
Lua
<lang lua>print(math.cos(1), math.sin(1), math.tan(1), math.atan(1), math.atan2(3, 4))</lang>
MATLAB
A full list of built-in trig functions can be found in the MATLAB Documentation.
<lang MATLAB>function trigExample(angleDegrees)
angleRadians = angleDegrees * (pi/180); disp(sprintf('sin(%f)= %f\nasin(%f)= %f',[angleRadians sin(angleRadians) sin(angleRadians) asin(sin(angleRadians))])); disp(sprintf('sind(%f)= %f\narcsind(%f)= %f',[angleDegrees sind(angleDegrees) sind(angleDegrees) asind(sind(angleDegrees))])); disp('-----------------------'); disp(sprintf('cos(%f)= %f\nacos(%f)= %f',[angleRadians cos(angleRadians) cos(angleRadians) acos(cos(angleRadians))])); disp(sprintf('cosd(%f)= %f\narccosd(%f)= %f',[angleDegrees cosd(angleDegrees) cosd(angleDegrees) acosd(cosd(angleDegrees))])); disp('-----------------------'); disp(sprintf('tan(%f)= %f\natan(%f)= %f',[angleRadians tan(angleRadians) tan(angleRadians) atan(tan(angleRadians))])); disp(sprintf('tand(%f)= %f\narctand(%f)= %f',[angleDegrees tand(angleDegrees) tand(angleDegrees) atand(tand(angleDegrees))]));
end</lang>
Sample Output: <lang MATLAB>>> trigExample(78) sin(1.361357)= 0.978148 asin(0.978148)= 1.361357 sind(78.000000)= 0.978148 arcsind(0.978148)= 78.000000
cos(1.361357)= 0.207912 acos(0.207912)= 1.361357 cosd(78.000000)= 0.207912 arccosd(0.207912)= 78.000000
tan(1.361357)= 4.704630 atan(4.704630)= 1.361357 tand(78.000000)= 4.704630 arctand(4.704630)= 78.000000</lang>
MAXScript
Maxscript trigonometric functions accept degrees only. The built-ins degToRad and radToDeg allow easy conversion. <lang maxscript>local radians = pi / 4 local degrees = 45.0
--sine print (sin (radToDeg radians)) print (sin degrees) --cosine print (cos (radToDeg radians)) print (cos degrees) --tangent print (tan (radToDeg radians)) print (tan degrees) --arcsine print (asin (sin (radToDeg radians))) print (asin (sin degrees)) --arccosine print (acos (cos (radToDeg radians))) print (acos (cos degrees)) --arctangent print (atan (tan (radToDeg radians))) print (atan (tan degrees))</lang>
Metafont
Metafont has sind
and cosd
, which compute sine and cosine of an angle expressed in degree. We need to define the rest.
<lang metafont>Pi := 3.14159; vardef torad expr x = Pi*x/180 enddef; % conversions vardef todeg expr x = 180x/Pi enddef; vardef sin expr x = sind(todeg(x)) enddef; % radians version of sind vardef cos expr x = cosd(todeg(x)) enddef; % and cosd
vardef sign expr x = if x>=0: 1 else: -1 fi enddef; % commodity
vardef tand expr x = % tan with arg in degree
if cosd(x) = 0: infinity * sign(sind(x)) else: sind(x)/cosd(x) fi enddef;
vardef tan expr x = tand(todeg(x)) enddef; % arg in rad
% INVERSE
% the arc having x as tanget is that between x-axis and a line % from the center to the point (1, x); MF angle says this vardef atand expr x = angle(1,x) enddef; vardef atan expr x = torad(atand(x)) enddef; % rad version
% known formula to express asin and acos in function of % atan; a+-+b stays for sqrt(a^2 - b^2) (defined in plain MF) vardef asin expr x = 2atan(x/(1+(1+-+x))) enddef; vardef acos expr x = 2atan((1+-+x)/(1+x)) enddef;
vardef asind expr x = todeg(asin(x)) enddef; % degree versions vardef acosd expr x = todeg(acos(x)) enddef;
% commodity def outcompare(expr a, b) = message decimal a & " = " & decimal b enddef;
% output tests outcompare(torad(60), Pi/3); outcompare(todeg(Pi/6), 30);
outcompare(Pi/3, asin(sind(60))); outcompare(30, acosd(cos(Pi/6))); outcompare(45, atand(tand(45))); outcompare(Pi/4, atan(tand(45)));
outcompare(sin(Pi/3), sind(60)); outcompare(cos(Pi/4), cosd(45)); outcompare(tan(Pi/3), tand(60));
end</lang>
OCaml
OCaml's preloaded Pervasives module contains all six functions. The functions all accept radians only, so conversion is necessary when dealing with degrees. <lang ocaml>let pi = 4. *. atan 1.
let radians = pi /. 4. let degrees = 45.;;
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);; Printf.printf "%f %f\n" arcsin (arcsin *. 180. /. pi);; let arccos = acos (cos radians);; Printf.printf "%f %f\n" arccos (arccos *. 180. /. pi);; let arctan = atan (tan radians);; Printf.printf "%f %f\n" arctan (arctan *. 180. /. pi);;</lang> 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
Octave
<lang octave>function d = degree(rad)
d = 180*rad/pi;
endfunction
r = pi/3; rd = degree(r);
funcs = { "sin", "cos", "tan", "sec", "cot", "csc" }; ifuncs = { "asin", "acos", "atan", "asec", "acot", "acsc" };
for i = 1 : numel(funcs)
v = arrayfun(funcs{i}, r); vd = arrayfun(strcat(funcs{i}, "d"), rd); iv = arrayfun(ifuncs{i}, v); ivd = arrayfun(strcat(ifuncs{i}, "d"), vd); printf("%s(%f) = %s(%f) = %f (%f)\n", funcs{i}, r, strcat(funcs{i}, "d"), rd, v, vd); printf("%s(%f) = %f\n%s(%f) = %f\n", ifuncs{i}, v, iv, strcat(ifuncs{i}, "d"), vd, ivd);
endfor</lang>
Output:
sin(1.047198) = sind(60.000000) = 0.866025 (0.866025) asin(0.866025) = 1.047198 asind(0.866025) = 60.000000 cos(1.047198) = cosd(60.000000) = 0.500000 (0.500000) acos(0.500000) = 1.047198 acosd(0.500000) = 60.000000 tan(1.047198) = tand(60.000000) = 1.732051 (1.732051) atan(1.732051) = 1.047198 atand(1.732051) = 60.000000 sec(1.047198) = secd(60.000000) = 2.000000 (2.000000) asec(2.000000) = 1.047198 asecd(2.000000) = 60.000000 cot(1.047198) = cotd(60.000000) = 0.577350 (0.577350) acot(0.577350) = 1.047198 acotd(0.577350) = 60.000000 csc(1.047198) = cscd(60.000000) = 1.154701 (1.154701) acsc(1.154701) = 1.047198 acscd(1.154701) = 60.000000
(Lacking in this code but present in GNU Octave: sinh, cosh, tanh, coth and inverses)
Oz
<lang oz>declare
PI = 3.14159265
fun {FromDegrees Deg} Deg * PI / 180. end
fun {ToDegrees Rad} Rad * 180. / PI end
Radians = PI / 4. Degrees = 45.
in
for F in [Sin Cos Tan] do {System.showInfo {F Radians}#" "#{F {FromDegrees Degrees}}} end
for I#F in [Asin#Sin Acos#Cos Atan#Tan] do {System.showInfo {I {F Radians}}#" "#{ToDegrees {I {F Radians}}}} end</lang>
PARI/GP
Pari accepts only radians; the conversion is simple but not included here. <lang>cos(Pi/2) sin(Pi/2) tan(Pi/2) acos(1) asin(1) atan(1)</lang>
Perl
<lang perl>use Math::Trig;
my $angle_degrees = 45; my $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"; my $asin = asin(sin($angle_radians)); print $asin, ' ', rad2deg($asin), "\n"; my $acos = acos(cos($angle_radians)); print $acos, ' ', rad2deg($acos), "\n"; my $atan = atan(tan($angle_radians)); print $atan, ' ', rad2deg($atan), "\n"; my $acot = acot(cot($angle_radians)); print $acot, ' ', rad2deg($acot), "\n";</lang>
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
Perl 6
<lang perl6>say sin(pi/3), ' ', sin 60, 'd'; # 'g' (gradians) and 1 (circles) say cos(pi/4), ' ', cos 45, 'd'; # are also recognized. say tan(pi/6), ' ', tan 30, 'd';
say asin(sqrt(3)/2), ' ', asin sqrt(3)/2, 'd'; say acos(1/sqrt 2), ' ', acos 1/sqrt(2), 'd'; say atan(1/sqrt 3), ' ', atan 1/sqrt(3), 'd';</lang>
PL/I
<lang PL/I> declare (x, xd, y, v) float;
x = 0.5; xd = 45;
/* angle in radians: */ v = sin(x); y = asin(v); put skip list (y); v = cos(x); y = acos(v); put skip list (y); v = tan(x); y = atan(v); put skip list (y);
/* angle in degrees: */ v = sind(xd); put skip list (v); v = cosd(xd); put skip list (v); v = tand(xd); y = atand(v); put skip list (y);
/* hyperbolic functions: */ v = sinh(x); put skip list (v); v = cosh(x); put skip list (v); v = tanh(x); y = atanh(v); put skip list (y); </lang>
PHP
<lang php>$radians = M_PI / 4; $degrees = 45 * M_PI / 180; echo sin($radians) . " " . sin($degrees); echo cos($radians) . " " . cos($degrees); echo tan($radians) . " " . tan($degrees); echo asin(sin($radians)) . " " . asin(sin($radians)) * 180 / M_PI; echo acos(cos($radians)) . " " . acos(cos($radians)) * 180 / M_PI; echo atan(tan($radians)) . " " . atan(tan($radians)) * 180 / M_PI;</lang>
PicoLisp
<lang PicoLisp>(load "@lib/math.l")
(de dtor (Deg)
(*/ Deg pi 180.0) )
(de rtod (Rad)
(*/ Rad 180.0 pi) )
(prinl
(format (sin (/ pi 4)) *Scl) " " (format (sin (dtor 45.0)) *Scl) )
(prinl
(format (cos (/ pi 4)) *Scl) " " (format (cos (dtor 45.0)) *Scl) )
(prinl
(format (tan (/ pi 4)) *Scl) " " (format (tan (dtor 45.0)) *Scl) )
(prinl
(format (asin (sin (/ pi 4))) *Scl) " " (format (rtod (asin (sin (dtor 45.0)))) *Scl) )
(prinl
(format (acos (cos (/ pi 4))) *Scl) " " (format (rtod (acos (cos (dtor 45.0)))) *Scl) )
(prinl
(format (atan (tan (/ pi 4))) *Scl) " " (format (rtod (atan (tan (dtor 45.0)))) *Scl) )</lang>
Output:
0.707107 0.707107 0.707107 0.707107 1.000000 1.000000 0.785398 44.999986 0.785398 44.999986 0.785398 44.999986
Pop11
Pop11 trigonometric functions accept both degrees and radians. In default mode argument is in degrees, after setting 'popradians' flag to 'true' arguments are in radians.
<lang pop11>sin(30) => cos(45) => tan(45) => arcsin(0.7) => arccos(0.7) => arctan(0.7) =>
- switch to radians
true -> popradians;
sin(pi*30/180) => cos(pi*45/180) => tan(pi*45/180) => arcsin(0.7) => arccos(0.7) => arctan(0.7) =></lang>
PostScript
<lang postscript> 90 sin =
60 cos =
%tan of 45 degrees
45 sin 45 cos div =
%inverse tan ( arc tan of sqrt 3)
3 sqrt 1 atan = </lang> Output
1.0 0.5 1.0 60.0
PowerShell
<lang powershell>$rad = [Math]::PI / 4 $deg = 45 '{0,10} {1,10}' -f 'Radians','Degrees' '{0,10:N6} {1,10:N6}' -f [Math]::Sin($rad), [Math]::Sin($deg * [Math]::PI / 180) '{0,10:N6} {1,10:N6}' -f [Math]::Cos($rad), [Math]::Cos($deg * [Math]::PI / 180) '{0,10:N6} {1,10:N6}' -f [Math]::Tan($rad), [Math]::Tan($deg * [Math]::PI / 180) $temp = [Math]::Asin([Math]::Sin($rad)) '{0,10:N6} {1,10:N6}' -f $temp, ($temp * 180 / [Math]::PI) $temp = [Math]::Acos([Math]::Cos($rad)) '{0,10:N6} {1,10:N6}' -f $temp, ($temp * 180 / [Math]::PI) $temp = [Math]::Atan([Math]::Tan($rad)) '{0,10:N6} {1,10:N6}' -f $temp, ($temp * 180 / [Math]::PI)</lang> Output:
Radians Degrees 0,707107 0,707107 0,707107 0,707107 1,000000 1,000000 0,785398 45,000000 0,785398 45,000000 0,785398 45,000000
PureBasic
<lang purebasic>OpenConsole()
Macro DegToRad(deg)
deg*#PI/180
EndMacro Macro RadToDeg(rad)
rad*180/#PI
EndMacro
degree = 45 radians.f = #PI/4
PrintN(StrF(Sin(DegToRad(degree)))+" "+StrF(Sin(radians))) PrintN(StrF(Cos(DegToRad(degree)))+" "+StrF(Cos(radians))) PrintN(StrF(Tan(DegToRad(degree)))+" "+StrF(Tan(radians)))
arcsin.f = ASin(Sin(radians)) PrintN(StrF(arcsin)+" "+Str(RadToDeg(arcsin))) arccos.f = ACos(Cos(radians)) PrintN(StrF(arccos)+" "+Str(RadToDeg(arccos))) arctan.f = ATan(Tan(radians)) PrintN(StrF(arctan)+" "+Str(RadToDeg(arctan)))
Input()</lang>
Output:
0.707107 0.707107 0.707107 0.707107 1.000000 1.000000 0.785398 45 0.785398 45 0.785398 45
Python
Python's math module contains all six functions. The functions all accept radians only, so conversion is necessary when dealing with degrees. The math module also has degrees() and radians() functions for easy conversion.
<lang python>import math
radians = math.pi / 4 degrees = 45.0
- sine
print math.sin(radians), math.sin(math.radians(degrees))
- cosine
print math.cos(radians), math.cos(math.radians(degrees))
- tangent
print math.tan(radians), math.tan(math.radians(degrees))
- arcsine
arcsin = math.asin(math.sin(radians)) print arcsin, math.degrees(arcsin)
- arccosine
arccos = math.acos(math.cos(radians)) print arccos, math.degrees(arccos)
- arctangent
arctan = math.atan(math.tan(radians)) print arctan, math.degrees(arctan)</lang>
Output:
0.707106781187 0.707106781187 0.707106781187 0.707106781187 1.0 1.0 0.785398163397 45.0 0.785398163397 45.0 0.785398163397 45.0
R
<lang R>deg <- function(radians) 180*radians/pi rad <- function(degrees) degrees*pi/180 sind <- function(ang) sin(rad(ang)) cosd <- function(ang) cos(rad(ang)) tand <- function(ang) tan(rad(ang)) asind <- function(v) deg(asin(v)) acosd <- function(v) deg(acos(v)) atand <- function(v) deg(atan(v))
r <- pi/3 rd <- deg(r)
print( c( sin(r), sind(rd)) ) print( c( cos(r), cosd(rd)) ) print( c( tan(r), tand(rd)) )
S <- sin(pi/4) C <- cos(pi/3) T <- tan(pi/4)
print( c( asin(S), asind(S) ) ) print( c( acos(C), acosd(C) ) ) print( c( atan(T), atand(T) ) )</lang>
REBOL
<lang REBOL>REBOL [ Title: "Trigonometric Functions" Author: oofoe Date: 2009-12-07 URL: http://rosettacode.org/wiki/Trigonometric_Functions ]
radians: pi / 4 degrees: 45.0
- Unlike most languages, REBOL's trig functions work in degrees unless
- you specify differently.
print [sine/radians radians sine degrees] print [cosine/radians radians cosine degrees] print [tangent/radians radians tangent degrees]
d2r: func [ "Convert degrees to radians." d [number!] "Degrees" ][d * pi / 180]
arcsin: arcsine sine degrees print [d2r arcsin arcsin]
arccos: arccosine cosine degrees print [d2r arccos arccos]
arctan: arctangent tangent degrees print [d2r arctan arctan]</lang>
Output:
0.707106781186547 0.707106781186547 0.707106781186548 0.707106781186548 1.0 1.0 0.785398163397448 45.0 0.785398163397448 45.0 0.785398163397448 45.0
REXX
The REXX language doesn't have any trig functions (or for that matter, a square root [SQRT] function), so if higher math
functions are wanted, you have to roll your own. Some of the normal/regular trig functions are included here.
Normally, math BIFs (those built-in or otherwise supplied with the language) have higher accuracy (digits) so as
to provide accurant calculations. One common method in REXX is to specify more digits (via NUMERIC DIGITS nnn)
than is needed, then reduce the digits and re-normalize a number (either with the FORMAT BIF or simply dividing by 1).
<lang rexx>
/*REXX program demonstrates some common trig functions. */
numeric digits 9 /*the default, but what the hey!*/ numeric digits 100 /*let's go a wee bit crazy here.*/ showdigs=10 /*show only ten digits of number*/
do j=-180 to +180 by 15 /*let's just do a half-Monty. */ if j//45\==0 & j//30\==0 then iterate /*skip the boring angles. */ /*don't let TAN go postal.*/ if abs(j)==90 then say right(j,4) 'degrees, rads='show( d2r(j)), ' sin='show(sinD(j)), ' cos='show(cosD(J)) else say right(j,4) 'degrees, rads='show( d2r(j)), ' sin='show(sinD(j)), ' cos='show(cosD(J)), ' tan='show(tanD(j)) end
say
do k=-1 to +1 by 1/2 /*keep the Arc-functions happy. */ say right(k,4) 'radians, degs='show( r2d(k)), 'Acos='show(Acos(k)), 'Asin='show(Asin(k)), 'Atan='show(Atan(k)) end
exit
/*REXX ignores the label's case. */
/*─────────────────────────────────────subroutines──────────────────────*/
/*add a prefixed blank if not neg*/
show: return left(left(,arg(1)>=0)format(arg(1),,showdigs)/1,showdigs)
Acos: procedure; arg x; if x<-1|x>1 then call AcosErr; return .5*pi()-Asin(x)
AcosD: return r2d(Acos(arg(1)))
Asin: procedure; arg x; if x<-1 | x>1 then call AsinErr; s=x*x;
if abs(x)>=.7 then return sign(x)*Acos(sqrt(1-s)); z=x; o=x; p=z; do j=2 by 2; o=o*s*(j-1)/j; z=z+o/(j+1); if z=p then leave; p=z; end; return z
AsinD: return r2d(Asin(arg(1)))
Atan: procedure; arg x; if abs(x)=1 then return pi()/4*sign(x)
return Asin(x/sqrt(1+x**2))
cos: procedure; arg x; x=r2r(x); a=abs(x); numeric fuzz min(9,digits()-9);
if a=pi() then return -1; if a=pi()/2 | a=2*pi() then return 0; if a=pi()/3 then return .5; if a=2*pi()/3 then return -.5; return sincos(1,1,-1)
cosD: return cos(d2r(arg(1)))
sin: procedure; arg x; x=r2r(x); numeric fuzz min(5,digits()-3);
if abs(x)=pi() then return 0; return sinCos(x,x,1)
sinD: return sin(d2r(arg(1)))
sinCos: parse arg z,_,i; x=x*x; p=z;
do k=2 by 2; _=-_*x/(k*(k+i));z=z+_; if z=p then leave;p=z;end; return z
tan: procedure; arg x; _=cos(x); if _=0 then call tanErr; return sin(x)/_
tanD: return tan(d2r(arg(1)))
sqrt: procedure; parse arg x; if x=0 then return 0;d=digits();numeric digits 11;
g=sqrtGuess(); do j=0 while p>9; m.j=p; p=p%2+1; end; do k=j+5 to 0 by -1; if m.k>11 then numeric digits m.k; g=.5*(g+x/g); end; numeric digits d; return g/1
sqrtGuess: if x<0 then call sqrtErr; numeric form scientific; m.=11; p=d+d%4+2;
parse value format(x,2,1,,0) 'E0' with g 'E' _ .; return g*.5'E'_%2
e: return, 2.7182818284590452353602874713526624977572470936999595749669676277240766303535
/*Note: the real E subroutine returns E's accuracy that */ /*matches the current NUMERIC DIGITS, up to 1 million digits.*/
exp: procedure; arg x; ix=x%1; if abs(x-ix)>.5 then ix=ix+sign(x); x=x-ix;
z=1; _=1; w=z; do j=1; _=_*x/j; z=(z+_)/1; if z==w then leave; w=z; end; if z\==0 then z=z*e()**ix; return z
pi: return, /*a bit of overkill, but hey !! */ 3.1415926535897932384626433832795028841971693993751058209749445923078164062862
/*Note: the real PI subroutine returns PI's accuracy that */ /*matches the current NUMERIC DIGITS, up to 1 million digits.*/ /*John Machin's formula is used for calculating more digits. */
d2d: return arg(1)//360 /*normalize degrees►1 unit circle*/ d2r: return r2r(arg(1)*pi()/180) /*convert degrees ──► radians. */ r2d: return d2d((arg(1)*180/pi())) /*convert radians ──► degrees. */ r2r: return arg(1)//(2*pi()) /*normalize radians►1 unit circle*/
tellErr: say; say '*** error! ***'; say; say arg(1); say; exit 13 tanErr: call tellErr 'tan('||x") causes division by zero, X="||x AsinErr: call tellErr 'Asin(x), X must be in the range of -1 --> +1, X='||x sqrtErr: call tellErr "sqrt(x), X can't be negative, X="||x AcosErr: call tellErr 'Acos(x), X must be in the range of -1 --> +1, X='||x
/*Not included here are: (among others): */ /*some of the usual higher-math functions normally associated */ /* with trig functions: POW, GAMMA, LGGAMMA, ERF, ERFC, ROOT, */ /* LOG (LN), LOG2, LOG10, ATAN2, others. */ /*all of the hyperbolic trig functions and their inverses, */ /* (too many to name here). */ /*Angle conversions/normalizations: degrees/radians/grads/mils */ /* in a circle: 2 pi radians, 360 degrees, 400 grads, 6400 mils*/ /*Some of the other trig functions (hyphens added intentially):*/ /* CHORD, */ /* COT (co-tangent) */ /* CSC (co-secant) */ /* CVC (co-versed cosine) */ /* CVS (co-versed sine) */ /* CXS (co-exsecant) */ /* HAC (haver-cosine) */ /* HAV (haver-sine */ /* SEC (secant) */ /* VCS (versed cosine or vercosine) */ /* VSN (versed sine or versine) */ /* XCS (ex-secant) */ /* COS/SIN/TAN cardinal (damped COS/SIN/TAN function) */ /* COS/SIN integral */ /* and all pertinent of the above's inverses (AVSN, ACVS...) */
</lang> Output:
-180 degrees, rads=-3.1415926 sin= 0 cos=-1 tan= 0 -150 degrees, rads=-2.6179938 sin=-0.5 cos=-0.8660254 tan= 0.5773502 -135 degrees, rads=-2.3561944 sin=-0.7071067 cos=-0.7071067 tan= 1 -120 degrees, rads=-2.0943951 sin=-0.8660254 cos=-0.5 tan= 1.7320508 -90 degrees, rads=-1.5707963 sin=-1 cos= 0 -60 degrees, rads=-1.0471975 sin=-0.8660254 cos= 0.5 tan=-1.7320508 -45 degrees, rads=-0.7853981 sin=-0.7071067 cos= 0.7071067 tan=-1 -30 degrees, rads=-0.5235987 sin=-0.5 cos= 0.8660254 tan=-0.5773502 0 degrees, rads= 0 sin= 0 cos= 1 tan= 0 30 degrees, rads= 0.5235987 sin= 0.5 cos= 0.8660254 tan= 0.5773502 45 degrees, rads= 0.7853981 sin= 0.7071067 cos= 0.7071067 tan= 1 60 degrees, rads= 1.0471975 sin= 0.8660254 cos= 0.5 tan= 1.7320508 90 degrees, rads= 1.5707963 sin= 1 cos= 0 120 degrees, rads= 2.0943951 sin= 0.8660254 cos=-0.5 tan=-1.7320508 135 degrees, rads= 2.3561944 sin= 0.7071067 cos=-0.7071067 tan=-1 150 degrees, rads= 2.6179938 sin= 0.5 cos=-0.8660254 tan=-0.5773502 180 degrees, rads= 3.1415926 sin= 0 cos=-1 tan= 0 -1 radians, degs=-57.295779 Acos= 3.1415926 Asin=-1.5707963 Atan=-0.7853981 -0.5 radians, degs=-28.647889 Acos= 2.0943951 Asin=-0.5235987 Atan=-0.4636476 0 radians, degs= 0 Acos= 1.5707963 Asin= 0 Atan= 0 0.5 radians, degs= 28.647889 Acos= 1.0471975 Asin= 0.5235987 Atan= 0.4636476 1.0 radians, degs= 57.295779 Acos= 0 Asin= 1.5707963 Atan= 0.7853981
Ruby
Ruby's Math module contains all six functions. The functions all accept radians only, so conversion is necessary when dealing with degrees.
<lang ruby>radians = Math::PI / 4 degrees = 45.0
def deg2rad(d)
d * Math::PI / 180
end
def rad2deg(r)
r * 180 / Math::PI
end
- sine
puts "#{Math.sin(radians)} #{Math.sin(deg2rad(degrees))}"
- cosine
puts "#{Math.cos(radians)} #{Math.cos(deg2rad(degrees))}"
- tangent
puts "#{Math.tan(radians)} #{Math.tan(deg2rad(degrees))}"
- arcsine
arcsin = Math.asin(Math.sin(radians)) puts "#{arcsin} #{rad2deg(arcsin)}"
- arccosine
arccos = Math.acos(Math.cos(radians)) puts "#{arccos} #{rad2deg(arccos)}"
- arctangent
arctan = Math.atan(Math.tan(radians)) puts "#{arctan} #{rad2deg(arctan)}"</lang>
Output:
0.707106781187 0.707106781187 0.707106781187 0.707106781187 1.0 1.0 0.785398163397 45.0 0.785398163397 45.0 0.785398163397 45.0
Scheme
<lang scheme>(define pi (* 4 (atan 1)))
(define radians (/ pi 4)) (define degrees 45)
(display (sin radians)) (display " ") (display (sin (* degrees (/ pi 180)))) (newline)
(display (cos radians)) (display " ") (display (cos (* degrees (/ pi 180)))) (newline)
(display (tan radians)) (display " ") (display (tan (* degrees (/ pi 180)))) (newline)
(define arcsin (asin (sin radians))) (display arcsin) (display " ") (display (* arcsin (/ 180 pi))) (newline)
(define arccos (acos (cos radians))) (display arccos) (display " ") (display (* arccos (/ 180 pi))) (newline)
(define arctan (atan (tan radians))) (display arctan) (display " ") (display (* arctan (/ 180 pi))) (newline)</lang>
Tcl
The built-in functions only take radian arguments. <lang tcl>package require Tcl 8.5
proc PI {} {expr {4*atan(1)}} proc deg2rad d {expr {$d/180*[PI]}} proc rad2deg r {expr {$r*180/[PI]}}
namespace path ::tcl::mathfunc
proc trig degrees {
set radians [deg2rad $degrees] puts [sin $radians] puts [cos $radians] puts [tan $radians] set arcsin [asin [sin $radians]]; puts "$arcsin [rad2deg $arcsin]" set arccos [acos [cos $radians]]; puts "$arccos [rad2deg $arccos]" set arctan [atan [tan $radians]]; puts "$arctan [rad2deg $arctan]"
} trig 60.0</lang>
0.8660254037844386 0.5000000000000001 1.7320508075688767 1.0471975511965976 59.99999999999999 1.0471975511965976 59.99999999999999 1.0471975511965976 59.99999999999999
- Programming Tasks
- Arithmetic operations
- GAP/Omit
- ActionScript
- Ada
- ALGOL 68
- AutoHotkey
- AWK
- BASIC
- C
- C++
- C sharp
- Clojure
- Common Lisp
- D
- E
- Fantom
- Forth
- Fortran
- Groovy
- Haskell
- HicEst
- IDL
- Icon
- Unicon
- J
- Java
- JavaScript
- Liberty BASIC
- Logo
- Lua
- MATLAB
- MAXScript
- Metafont
- OCaml
- Octave
- Oz
- PARI/GP
- Perl
- Perl 6
- PL/I
- PHP
- PicoLisp
- Pop11
- PostScript
- PowerShell
- PureBasic
- Python
- R
- REBOL
- REXX
- Ruby
- Scheme
- Tcl
- Batch File/Omit
- M4/Omit