tw0788.pp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. {$ifdef FPC}
  2. Uses Math;
  3. {$else not FPC}
  4. function degtorad(deg : extended) : extended;
  5. begin
  6. degtorad:=deg*(pi/180.0);
  7. end;
  8. function radtodeg(rad : extended) : extended;
  9. begin
  10. radtodeg:=rad*(180.0/pi);
  11. end;
  12. function ArcSin(x : extended) : extended;
  13. begin
  14. if abs(x)=1.0 then
  15. arcsin:=Pi/2
  16. else
  17. arcsin:=ArcTan(x/sqrt(1-x*x));
  18. end;
  19. function ArcTan2(x,y : extended) : extended;
  20. begin
  21. ArcTan2:=ArcTan(x/y);
  22. end;
  23. {$endif not FPC}
  24. Var
  25. I : Integer;
  26. RI,RRI,R0 : extended;
  27. Begin
  28. For I := -179 To 179 Do
  29. Begin
  30. RI:=I;
  31. WriteLn( RadToDeg(ArcSin(Sin(DegToRad(RI)))):3:18);
  32. End;
  33. For I := -89 To 89 Do
  34. Begin
  35. RI:=I;
  36. RRI:=RadToDeg(ArcSin( Sin(DegToRad(RI))));
  37. WriteLn(RI:3:18,' ',RRI:3:18);
  38. If RI<>RRI then
  39. begin
  40. Writeln('Not exact ',RRI-RI:3:18);
  41. if I<>0 then
  42. begin
  43. Writeln('Percentage error = ',Abs(RRI -RI) *100 / I:3:18);
  44. if abs((RRI -RI) *100 / I)>0.0001 then
  45. Begin
  46. Writeln('Error too big ');
  47. Halt(1);
  48. end;
  49. end;
  50. end;
  51. End;
  52. RI:=3;
  53. RRI:=1;
  54. R0:=1;
  55. Writeln( ArcTan2(ArcTan2(1,1),R0):3:18 , ' should be 0.66577375...');
  56. if ArcTan2(ArcTan2(1,1),R0)<>ArcTan(ArcTan(1)/R0) then
  57. begin
  58. Writeln('There is still a bug in ArcTan2 !');
  59. Halt(1);
  60. end;
  61. End.