test_trig.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Boost.Units - A C++ library for zero-overhead dimensional analysis and
  2. // unit/quantity manipulation and conversion
  3. //
  4. // Copyright (C) 2009 Steven Watanabe
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. /**
  10. \file
  11. \brief test_trig.cpp
  12. \details
  13. Test trigonometric functions.
  14. Output:
  15. @verbatim
  16. @endverbatim
  17. **/
  18. #include <cmath>
  19. #include <boost/units/cmath.hpp>
  20. #include <boost/units/io.hpp>
  21. #include <boost/units/systems/si/plane_angle.hpp>
  22. #include <boost/units/systems/si/length.hpp>
  23. #include <boost/units/systems/si/dimensionless.hpp>
  24. #include <boost/units/systems/angle/degrees.hpp>
  25. #define BOOST_TEST_MAIN
  26. #include <boost/test/unit_test.hpp>
  27. using boost::units::si::radians;
  28. using boost::units::si::si_dimensionless;
  29. using boost::units::degree::degrees;
  30. BOOST_UNITS_STATIC_CONSTANT(degree_dimensionless, boost::units::degree::dimensionless);
  31. using boost::units::si::meters;
  32. BOOST_UNITS_STATIC_CONSTANT(heterogeneous_dimensionless, boost::units::reduce_unit<boost::units::si::dimensionless>::type);
  33. BOOST_AUTO_TEST_CASE(test_sin) {
  34. BOOST_CHECK_EQUAL(boost::units::sin(2.0 * radians), std::sin(2.0) * si_dimensionless);
  35. BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(boost::units::sin(15.0 * degrees)), 0.2588, 0.0004);
  36. }
  37. BOOST_AUTO_TEST_CASE(test_cos) {
  38. BOOST_CHECK_EQUAL(boost::units::cos(2.0 * radians), std::cos(2.0) * si_dimensionless);
  39. BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(boost::units::cos(75.0 * degrees)), 0.2588, 0.0004);
  40. }
  41. BOOST_AUTO_TEST_CASE(test_tan) {
  42. BOOST_CHECK_EQUAL(boost::units::tan(2.0 * radians), std::tan(2.0) * si_dimensionless);
  43. BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(boost::units::tan(45.0 * degrees)), 1.0, 0.0001);
  44. }
  45. BOOST_AUTO_TEST_CASE(test_asin) {
  46. BOOST_CHECK_EQUAL(boost::units::asin(0.2 * si_dimensionless), std::asin(0.2) * radians);
  47. BOOST_CHECK_CLOSE_FRACTION(boost::units::asin(0.5 * degree_dimensionless).value(), 30.0, 0.0001);
  48. BOOST_CHECK_EQUAL(boost::units::asin(0.2 * heterogeneous_dimensionless).value(), std::asin(0.2));
  49. }
  50. BOOST_AUTO_TEST_CASE(test_acos) {
  51. BOOST_CHECK_EQUAL(boost::units::acos(0.2 * si_dimensionless), std::acos(0.2) * radians);
  52. BOOST_CHECK_CLOSE_FRACTION(boost::units::acos(0.5 * degree_dimensionless).value(), 60.0, 0.0001);
  53. BOOST_CHECK_EQUAL(boost::units::acos(0.2 * heterogeneous_dimensionless).value(), std::acos(0.2));
  54. }
  55. BOOST_AUTO_TEST_CASE(test_atan) {
  56. BOOST_CHECK_EQUAL(boost::units::atan(0.2 * si_dimensionless), std::atan(0.2) * radians);
  57. BOOST_CHECK_CLOSE_FRACTION(boost::units::atan(1.0 * degree_dimensionless).value(), 45.0, 0.0001);
  58. BOOST_CHECK_EQUAL(boost::units::atan(0.2 * heterogeneous_dimensionless).value(), std::atan(0.2));
  59. }
  60. BOOST_AUTO_TEST_CASE(test_atan2) {
  61. BOOST_CHECK_EQUAL(boost::units::atan2(0.2 * si_dimensionless, 0.3 * si_dimensionless), std::atan2(0.2, 0.3) * radians);
  62. BOOST_CHECK_EQUAL(boost::units::atan2(0.2 * meters, 0.3 * meters), std::atan2(0.2, 0.3) * radians);
  63. BOOST_CHECK_CLOSE_FRACTION(boost::units::atan2(0.8660*degree_dimensionless,0.5*degree_dimensionless).value(), 60., 0.0002);
  64. BOOST_CHECK_EQUAL(boost::units::atan2(0.2 * heterogeneous_dimensionless, 0.3 * heterogeneous_dimensionless).value(), std::atan2(0.2, 0.3));
  65. }