home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / packer / arc / arctool / trig.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-29  |  15.1 KB  |  498 lines

  1. {
  2.                        F i l e    I n f o r m a t i o n
  3.  
  4. * DESCRIPTION
  5. Supplies missing trigonometric functions for Turbo Pascal 4.0. Also
  6. provides hyperbolic, logarithmic, power, and root functions. All trig
  7. functions accessibile by radians, decimal degrees, degrees-minutes-seconds
  8. and a global DegreeType. Author: Hugo Hemmerich.
  9.  
  10. }
  11. unit Trig;
  12.  
  13. (*  TRIG  -  Supplies missing trigonometric functions for Turbo Pascal 4.0
  14.  *           Also provides hyperbolic, logarithmic, power, and root functions.
  15.  *           All trig functions accessible by radians, decimal degrees,
  16.  *           degrees-minutes-seconds, and a global DegreeType.  Conversions
  17.  *           between these are supplied.
  18.  *
  19.  *  Written November 23, 1987 by Hugo Hemmerich, Refined Technologies.
  20.  *  All code granted to the public domain.
  21.  *
  22.  *  Questions and comments to CompuServe account number 72376,3505
  23.  *)
  24.  
  25. interface
  26.  
  27. type
  28.   DegreeType =  record
  29.                   Degrees, Minutes, Seconds : real;
  30.                 end;
  31. const
  32.   Infinity = 9.9999999999E+37;
  33.  
  34. {  Radians  }
  35. { sin, cos, and arctan are predefined }
  36.  
  37. function Tan( Radians : real ) : real;
  38. function ArcSin( InValue : real ) : real;
  39. function ArcCos( InValue : real ) : real;
  40.  
  41. {  Degrees, expressed as a real number  }
  42.  
  43. function DegreesToRadians( Degrees : real ) : real;
  44. function RadiansToDegrees( Radians : real ) : real;
  45. function Sin_Degree( Degrees : real ) : real;
  46. function Cos_Degree( Degrees : real ) : real;
  47. function Tan_Degree( Degrees : real ) : real;
  48. function ArcSin_Degree( Degrees : real ) : real;
  49. function ArcCos_Degree( Degrees : real ) : real;
  50. function ArcTan_Degree( Degrees : real ) : real;
  51.  
  52. {  Degrees, in Degrees, Minutes, and Seconds, as real numbers  }
  53.  
  54. function DegreePartsToDegrees( Degrees, Minutes, Seconds : real ) : real;
  55. function DegreePartsToRadians( Degrees, Minutes, Seconds : real ) : real;
  56. procedure DegreesToDegreeParts( DegreesIn : real;
  57.                                 var Degrees, Minutes, Seconds : real );
  58. procedure RadiansToDegreeParts( Radians : real;
  59.                                 var Degrees, Minutes, Seconds : real );
  60. function Sin_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  61. function Cos_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  62. function Tan_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  63. function ArcSin_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  64. function ArcCos_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  65. function ArcTan_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  66.  
  67. {  Degrees, expressed as DegreeType ( reals in record ) }
  68.  
  69. function DegreeTypeToDegrees( DegreeVar : DegreeType ) : real;
  70. function DegreeTypeToRadians( DegreeVar : DegreeType ) : real;
  71. procedure DegreeTypeToDegreeParts( DegreeVar : DegreeType;
  72.                                    var Degrees, Minutes, Seconds : real );
  73. procedure DegreesToDegreeType( Degrees : real; var DegreeVar : DegreeType );
  74. procedure RadiansToDegreeType( Radians : real; var DegreeVar : DegreeType );
  75. procedure DegreePartsToDegreeType( Degrees, Minutes, Seconds : real;
  76.                                    var DegreeVar : DegreeType );
  77. function Sin_DegreeType( DegreeVar : DegreeType ) : real;
  78. function Cos_DegreeType( DegreeVar : DegreeType ) : real;
  79. function Tan_DegreeType( DegreeVar : DegreeType ) : real;
  80. function ArcSin_DegreeType( DegreeVar : DegreeType ) : real;
  81. function ArcCos_DegreeType( DegreeVar : DegreeType ) : real;
  82. function ArcTan_DegreeType( DegreeVar : DegreeType ) : real;
  83.  
  84. {  Hyperbolic functions  }
  85.  
  86. function Sinh( Invalue : real ) : real;
  87. function Cosh( Invalue : real ) : real;
  88. function Tanh( Invalue : real ) : real;
  89. function Coth( Invalue : real ) : real;
  90. function Sech( Invalue : real ) : real;
  91. function Csch( Invalue : real ) : real;
  92. function ArcSinh( Invalue : real ) : real;
  93. function ArcCosh( Invalue : real ) : real;
  94. function ArcTanh( Invalue : real ) : real;
  95. function ArcCoth( Invalue : real ) : real;
  96. function ArcSech( Invalue : real ) : real;
  97. function ArcCsch( Invalue : real ) : real;
  98.  
  99. {  Logarithms, Powers, and Roots  }
  100.  
  101. { e to the x  is  exp() }
  102. { natural log is  ln()  }
  103. function Log10( InNumber : real ) : real;
  104. function Log( Base, InNumber : real ) : real;  { log of any base }
  105. function Power( InNumber, Exponent : real ) : real;
  106. function Root( InNumber, TheRoot : real ) : real;
  107.  
  108. {----------------------------------------------------------------------}
  109. implementation
  110.  
  111. const
  112.   RadiansPerDegree =  0.017453292520;
  113.   DegreesPerRadian = 57.295779513;
  114.   MinutesPerDegree =   60.0;
  115.   SecondsPerDegree = 3600.0;
  116.   SecondsPerMinute = 60.0;
  117.   LnOf10 = 2.3025850930;
  118.  
  119. {-----------}
  120. {  Radians  }
  121. {-----------}
  122.  
  123. { sin, cos, and arctan are predefined }
  124.  
  125. function Tan { ( Radians : real ) : real };
  126.   { note: returns Infinity where appropriate }
  127.   var
  128.     CosineVal : real;
  129.     TangentVal : real;
  130.   begin
  131.   CosineVal := cos( Radians );
  132.   if CosineVal = 0.0 then
  133.     Tan := Infinity
  134.   else
  135.     begin
  136.     TangentVal := sin( Radians ) / CosineVal;
  137.     if ( TangentVal < -Infinity ) or ( TangentVal > Infinity ) then
  138.       Tan := Infinity
  139.     else
  140.       Tan := TangentVal;
  141.     end;
  142.   end;
  143.  
  144. function ArcSin{ ( InValue : real ) : real };
  145.   { notes: 1) exceeding input range of -1 through +1 will cause runtime error }
  146.   {        2) only returns principal values                                   }
  147.   {             ( -pi/2 through pi/2 radians ) ( -90 through +90 degrees )    }
  148.   begin
  149.   if abs( InValue ) = 1.0 then
  150.     ArcSin := pi / 2.0
  151.   else
  152.     ArcSin := arctan( InValue / sqrt( 1 - InValue * InValue ) );
  153.   end;
  154.  
  155. function ArcCos{ ( InValue : real ) : real };
  156.   { notes: 1) exceeding input range of -1 through +1 will cause runtime error }
  157.   {        2) only returns principal values                                   }
  158.   {             ( 0 through pi radians ) ( 0 through +180 degrees )           }
  159.   var
  160.     Result : real;
  161.   begin
  162.   if InValue = 0.0 then
  163.     ArcCos := pi / 2.0
  164.   else
  165.     begin
  166.     Result := arctan( sqrt( 1 - InValue * InValue ) / InValue );
  167.     if InValue < 0.0 then
  168.       ArcCos := Result + pi
  169.     else
  170.       ArcCos := Result;
  171.     end;
  172.   end;
  173.  
  174. {---------------------------------------}
  175. {  Degrees, expressed as a real number  }
  176. {---------------------------------------}
  177.  
  178. function DegreesToRadians{ ( Degrees : real ) : real };
  179.   begin
  180.   DegreesToRadians := Degrees * RadiansPerDegree;
  181.   end;
  182.  
  183. function RadiansToDegrees{ ( Radians : real ) : real };
  184.   begin
  185.   RadiansToDegrees := Radians * DegreesPerRadian;
  186.   end;
  187.  
  188. function Sin_Degree{ ( Degrees : real ) : real };
  189.   begin
  190.   Sin_Degree := sin( DegreesToRadians( Degrees ) );
  191.   end;
  192.  
  193. function Cos_Degree{ ( Degrees : real ) : real };
  194.   begin
  195.   Cos_Degree := cos( DegreesToRadians( Degrees ) );
  196.   end;
  197.  
  198. function Tan_Degree{ ( Degrees : real ) : real };
  199.   begin
  200.   Tan_Degree := Tan( DegreesToRadians( Degrees ) );
  201.   end;
  202.  
  203. function ArcSin_Degree{ ( Degrees : real ) : real };
  204.   begin
  205.   ArcSin_Degree := ArcSin( DegreesToRadians( Degrees ) );
  206.   end;
  207.  
  208. function ArcCos_Degree{ ( Degrees : real ) : real };
  209.   begin
  210.   ArcCos_Degree := ArcCos( DegreesToRadians( Degrees ) );
  211.   end;
  212.  
  213. function ArcTan_Degree{ ( Degrees : real ) : real };
  214.   begin
  215.   ArcTan_Degree := arctan( DegreesToRadians( Degrees ) );
  216.   end;
  217.  
  218. {--------------------------------------------------------------}
  219. {  Degrees, in Degrees, Minutes, and Seconds, as real numbers  }
  220. {--------------------------------------------------------------}
  221.  
  222. function DegreePartsToDegrees{ ( Degrees, Minutes, Seconds : real ) : real };
  223.   begin
  224.   DegreePartsToDegrees := Degrees + ( Minutes / MinutesPerDegree ) +
  225.                                        ( Seconds / SecondsPerDegree );
  226.   end;
  227.  
  228. function DegreePartsToRadians{ ( Degrees, Minutes, Seconds : real ) : real };
  229.   begin
  230.   DegreePartsToRadians := DegreesToRadians( DegreePartsToDegrees( Degrees,
  231.                                                         Minutes, Seconds ) );
  232.   end;
  233.  
  234. procedure DegreesToDegreeParts{ ( DegreesIn : real;
  235.                                   var Degrees, Minutes, Seconds : real ) };
  236.   begin
  237.   Degrees := int( DegreesIn );
  238.   Minutes := ( DegreesIn - Degrees ) * MinutesPerDegree;
  239.   Seconds := frac( Minutes );
  240.   Minutes := int( Minutes );
  241.   Seconds := Seconds * SecondsPerMinute;
  242.   end;
  243.  
  244. procedure RadiansToDegreeParts{ ( Radians : real;
  245.                                   var Degrees, Minutes, Seconds : real ) };
  246.   begin
  247.   DegreesToDegreeParts( RadiansToDegrees( Radians ),
  248.                           Degrees, Minutes, Seconds );
  249.   end;
  250.  
  251. function Sin_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  252.   begin
  253.   Sin_DegreeParts := sin( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  254.   end;
  255.  
  256. function Cos_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  257.   begin
  258.   Cos_DegreeParts := cos( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  259.   end;
  260.  
  261. function Tan_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  262.   begin
  263.   Tan_DegreeParts := Tan( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  264.   end;
  265.  
  266. function ArcSin_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  267.   begin
  268.   ArcSin_DegreeParts := ArcSin( DegreePartsToRadians( Degrees,
  269.                                                       Minutes, Seconds ) );
  270.   end;
  271.  
  272. function ArcCos_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  273.   begin
  274.   ArcCos_DegreeParts := ArcCos( DegreePartsToRadians( Degrees,
  275.                                                       Minutes, Seconds ) );
  276.   end;
  277.  
  278. function ArcTan_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  279.   begin
  280.   ArcTan_DegreeParts := arctan( DegreePartsToRadians( Degrees,
  281.                                                       Minutes, Seconds ) );
  282.   end;
  283.  
  284. {-------------------------------------------------------}
  285. {  Degrees, expressed as DegreeType ( reals in record ) }
  286. {-------------------------------------------------------}
  287.  
  288. function DegreeTypeToDegrees{ ( DegreeVar : DegreeType ) : real };
  289.   begin
  290.   DegreeTypeToDegrees := DegreePartsToDegrees( DegreeVar.Degrees,
  291.                                        DegreeVar.Minutes, DegreeVar.Seconds );
  292.   end;
  293.  
  294. function DegreeTypeToRadians{ ( DegreeVar : DegreeType ) : real };
  295.   begin
  296.   DegreeTypeToRadians := DegreesToRadians( DegreeTypeToDegrees( DegreeVar ) );
  297.   end;
  298.  
  299. procedure DegreeTypeToDegreeParts{ ( DegreeVar : DegreeType;
  300.                                      var Degrees, Minutes, Seconds : real ) };
  301.   begin
  302.   Degrees := DegreeVar.Degrees;
  303.   Minutes := DegreeVar.Minutes;
  304.   Seconds := DegreeVar.Seconds;
  305.   end;
  306.  
  307. procedure DegreesToDegreeType{ ( Degrees : real; var DegreeVar : DegreeType )};
  308.   begin
  309.   DegreesToDegreeParts( Degrees, DegreeVar.Degrees,
  310.                         DegreeVar.Minutes, DegreeVar.Seconds );
  311.   end;
  312.  
  313. procedure RadiansToDegreeType{ ( Radians : real; var DegreeVar : DegreeType )};
  314.   begin
  315.   DegreesToDegreeParts( RadiansToDegrees( Radians ), DegreeVar.Degrees,
  316.                         DegreeVar.Minutes, DegreeVar.Seconds );
  317.   end;
  318.  
  319. procedure DegreePartsToDegreeType{ ( Degrees, Minutes, Seconds : real;
  320.                                      var DegreeVar : DegreeType ) };
  321.   begin
  322.   DegreeVar.Degrees := Degrees;
  323.   DegreeVar.Minutes := Minutes;
  324.   DegreeVar.Seconds := Seconds;
  325.   end;
  326.  
  327. function Sin_DegreeType{ ( DegreeVar : DegreeType ) : real };
  328.   begin
  329.   Sin_DegreeType := sin( DegreeTypeToRadians( DegreeVar ) );
  330.   end;
  331.  
  332. function Cos_DegreeType{ ( DegreeVar : DegreeType ) : real };
  333.   begin
  334.   Cos_DegreeType := cos( DegreeTypeToRadians( DegreeVar ) );
  335.   end;
  336.  
  337. function Tan_DegreeType{ ( DegreeVar : DegreeType ) : real };
  338.   begin
  339.   Tan_DegreeType := Tan( DegreeTypeToRadians( DegreeVar ) );
  340.   end;
  341.  
  342. function ArcSin_DegreeType{ ( DegreeVar : DegreeType ) : real };
  343.   begin
  344.   ArcSin_DegreeType := ArcSin( DegreeTypeToRadians( DegreeVar ) );
  345.   end;
  346.  
  347. function ArcCos_DegreeType{ ( DegreeVar : DegreeType ) : real };
  348.   begin
  349.   ArcCos_DegreeType := ArcCos( DegreeTypeToRadians( DegreeVar ) );
  350.   end;
  351.  
  352. function ArcTan_DegreeType{ ( DegreeVar : DegreeType ) : real };
  353.   begin
  354.   ArcTan_DegreeType := arctan( DegreeTypeToRadians( DegreeVar ) );
  355.   end;
  356.  
  357. {------------------------}
  358. {  Hyperbolic functions  }
  359. {------------------------}
  360.  
  361. function Sinh{ ( Invalue : real ) : real };
  362.   const
  363.     MaxValue = 88.029691931;  { exceeds standard turbo precision }
  364.   var
  365.     Sign : real;
  366.   begin
  367.   Sign := 1.0;
  368.   if Invalue < 0 then
  369.     begin
  370.     Sign := -1.0;
  371.     Invalue := -Invalue;
  372.     end;
  373.   if Invalue > MaxValue then
  374.     Sinh := Infinity
  375.   else
  376.     Sinh := ( exp( Invalue ) - exp( -Invalue ) ) / 2.0 * Sign;
  377.   end;
  378.  
  379. function Cosh{ ( Invalue : real ) : real };
  380.   const
  381.     MaxValue = 88.029691931;  { exceeds standard turbo precision }
  382.   begin
  383.   Invalue := abs( Invalue );
  384.   if Invalue > MaxValue then
  385.     Cosh := Infinity
  386.   else
  387.     Cosh := ( exp( Invalue ) + exp( -Invalue ) ) / 2.0;
  388.   end;
  389.  
  390. function Tanh{ ( Invalue : real ) : real };
  391.   begin
  392.   Tanh := Sinh( Invalue ) / Cosh( Invalue );
  393.   end;
  394.  
  395. function Coth{ ( Invalue : real ) : real };
  396.   begin
  397.   Coth := Cosh( Invalue ) / Sinh( Invalue );
  398.   end;
  399.  
  400. function Sech{ ( Invalue : real ) : real };
  401.   begin
  402.   Sech := 1.0 / Cosh( Invalue );
  403.   end;
  404.  
  405. function Csch{ ( Invalue : real ) : real };
  406.   begin
  407.   Csch := 1.0 / Sinh( Invalue );
  408.   end;
  409.  
  410. function ArcSinh{ ( Invalue : real ) : real };
  411.   var
  412.     Sign : real;
  413.   begin
  414.   Sign := 1.0;
  415.   if Invalue < 0 then
  416.     begin
  417.     Sign := -1.0;
  418.     Invalue := -Invalue;
  419.     end;
  420.   ArcSinh := ln( Invalue + sqrt( Invalue*Invalue + 1 ) ) * Sign;
  421.   end;
  422.  
  423. function ArcCosh{ ( Invalue : real ) : real };
  424.   var
  425.     Sign : real;
  426.   begin
  427.   Sign := 1.0;
  428.   if Invalue < 0 then
  429.     begin
  430.     Sign := -1.0;
  431.     Invalue := -Invalue;
  432.     end;
  433.   ArcCosh := ln( Invalue + sqrt( Invalue*Invalue - 1 ) ) * Sign;
  434.   end;
  435.  
  436. function ArcTanh{ ( Invalue : real ) : real };
  437.   var
  438.     Sign : real;
  439.   begin
  440.   Sign := 1.0;
  441.   if Invalue < 0 then
  442.     begin
  443.     Sign := -1.0;
  444.     Invalue := -Invalue;
  445.     end;
  446.   ArcTanh := ln( ( 1 + Invalue ) / ( 1 - Invalue ) ) / 2.0 * Sign;
  447.   end;
  448.  
  449. function ArcCoth{ ( Invalue : real ) : real };
  450.   begin
  451.   ArcCoth := ArcTanh( 1.0 / Invalue );
  452.   end;
  453.  
  454. function ArcSech{ ( Invalue : real ) : real };
  455.   begin
  456.   ArcSech := ArcCosh( 1.0 / Invalue );
  457.   end;
  458.  
  459. function ArcCsch{ ( Invalue : real ) : real };
  460.   begin
  461.   ArcCsch := ArcSinh( 1.0 / Invalue );
  462.   end;
  463.  
  464. {---------------------------------}
  465. {  Logarithms, Powers, and Roots  }
  466. {---------------------------------}
  467.  
  468. { e to the x  is  exp() }
  469. { natural log is  ln()  }
  470.  
  471. function Log10{ ( InNumber : real ) : real };
  472.   begin
  473.   Log10 := ln( InNumber ) / LnOf10;
  474.   end;
  475.  
  476. function Log{ ( Base, InNumber : real ) : real };  { log of any base }
  477.   begin
  478.   Log := ln( InNumber ) / ln( Base );
  479.   end;
  480.  
  481. function Power{ ( InNumber, Exponent : real ) : real };
  482.   begin
  483.   if InNumber > 0.0 then
  484.     Power := exp( Exponent * ln( InNumber ) )
  485.   else if InNumber = 0.0 then
  486.     Power := 1.0
  487.   else { force runtime error }
  488.     Power := InNumber / 0.0;
  489.   end;
  490.  
  491. function Root{ ( InNumber, TheRoot : real ) : real };
  492.   begin
  493.   Root := Power( InNumber, ( 1.0 / TheRoot ) );
  494.   end;
  495.  
  496. end. { unit Trig }
  497. 
  498.