complex128_examples.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. ///////////////////////////////////////////////////////////////
  2. // Copyright 2018 Nick Thompson. Distributed under the Boost
  3. // Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
  5. /*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers.
  6. In the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers.
  7. */
  8. //[complex128_eg
  9. #include <iostream>
  10. #include <complex>
  11. #include <boost/multiprecision/complex128.hpp>
  12. template<class Complex>
  13. void complex_number_examples()
  14. {
  15. Complex z1{0, 1};
  16. std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10);
  17. std::cout << std::scientific << std::fixed;
  18. std::cout << "Print a complex number: " << z1 << std::endl;
  19. std::cout << "Square it : " << z1*z1 << std::endl;
  20. std::cout << "Real part : " << z1.real() << " = " << real(z1) << std::endl;
  21. std::cout << "Imaginary part : " << z1.imag() << " = " << imag(z1) << std::endl;
  22. using std::abs;
  23. std::cout << "Absolute value : " << abs(z1) << std::endl;
  24. std::cout << "Argument : " << arg(z1) << std::endl;
  25. std::cout << "Norm : " << norm(z1) << std::endl;
  26. std::cout << "Complex conjugate : " << conj(z1) << std::endl;
  27. std::cout << "Projection onto Riemann sphere: " << proj(z1) << std::endl;
  28. typename Complex::value_type r = 1;
  29. typename Complex::value_type theta = 0.8;
  30. using std::polar;
  31. std::cout << "Polar coordinates (phase = 0) : " << polar(r) << std::endl;
  32. std::cout << "Polar coordinates (phase !=0) : " << polar(r, theta) << std::endl;
  33. std::cout << "\nElementary special functions:\n";
  34. using std::exp;
  35. std::cout << "exp(z1) = " << exp(z1) << std::endl;
  36. using std::log;
  37. std::cout << "log(z1) = " << log(z1) << std::endl;
  38. using std::log10;
  39. std::cout << "log10(z1) = " << log10(z1) << std::endl;
  40. using std::pow;
  41. std::cout << "pow(z1, z1) = " << pow(z1, z1) << std::endl;
  42. using std::sqrt;
  43. std::cout << "Take its square root : " << sqrt(z1) << std::endl;
  44. using std::sin;
  45. std::cout << "sin(z1) = " << sin(z1) << std::endl;
  46. using std::cos;
  47. std::cout << "cos(z1) = " << cos(z1) << std::endl;
  48. using std::tan;
  49. std::cout << "tan(z1) = " << tan(z1) << std::endl;
  50. using std::asin;
  51. std::cout << "asin(z1) = " << asin(z1) << std::endl;
  52. using std::acos;
  53. std::cout << "acos(z1) = " << acos(z1) << std::endl;
  54. using std::atan;
  55. std::cout << "atan(z1) = " << atan(z1) << std::endl;
  56. using std::sinh;
  57. std::cout << "sinh(z1) = " << sinh(z1) << std::endl;
  58. using std::cosh;
  59. std::cout << "cosh(z1) = " << cosh(z1) << std::endl;
  60. using std::tanh;
  61. std::cout << "tanh(z1) = " << tanh(z1) << std::endl;
  62. using std::asinh;
  63. std::cout << "asinh(z1) = " << asinh(z1) << std::endl;
  64. using std::acosh;
  65. std::cout << "acosh(z1) = " << acosh(z1) << std::endl;
  66. using std::atanh;
  67. std::cout << "atanh(z1) = " << atanh(z1) << std::endl;
  68. }
  69. int main()
  70. {
  71. std::cout << "First, some operations we usually perform with std::complex:\n";
  72. complex_number_examples<std::complex<double>>();
  73. std::cout << "\nNow the same operations performed using quad precision complex numbers:\n";
  74. complex_number_examples<boost::multiprecision::complex128>();
  75. return 0;
  76. }
  77. //]
  78. /*
  79. //[complex128_out
  80. Print a complex number: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)
  81. Square it : -1.000000000000000000000000000000000
  82. Real part : 0.000000000000000000000000000000000 = 0.000000000000000000000000000000000
  83. Imaginary part : 1.000000000000000000000000000000000 = 1.000000000000000000000000000000000
  84. Absolute value : 1.000000000000000000000000000000000
  85. Argument : 1.570796326794896619231321691639751
  86. Norm : 1.000000000000000000000000000000000
  87. Complex conjugate : (0.000000000000000000000000000000000,-1.000000000000000000000000000000000)
  88. Projection onto Riemann sphere: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)
  89. Polar coordinates (phase = 0) : 1.000000000000000000000000000000000
  90. Polar coordinates (phase !=0) : (0.696706709347165389063740022772449,0.717356090899522792567167815703377)
  91. Elementary special functions:
  92. exp(z1) = (0.540302305868139717400936607442977,0.841470984807896506652502321630299)
  93. log(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)
  94. log10(z1) = (0.000000000000000000000000000000000,0.682188176920920673742891812715678)
  95. pow(z1, z1) = 0.207879576350761908546955619834979
  96. Take its square root : (0.707106781186547524400844362104849,0.707106781186547524400844362104849)
  97. sin(z1) = (0.000000000000000000000000000000000,1.175201193643801456882381850595601)
  98. cos(z1) = 1.543080634815243778477905620757061
  99. tan(z1) = (0.000000000000000000000000000000000,0.761594155955764888119458282604794)
  100. asin(z1) = (0.000000000000000000000000000000000,0.881373587019543025232609324979792)
  101. acos(z1) = (1.570796326794896619231321691639751,-0.881373587019543025232609324979792)
  102. atan(z1) = (0.000000000000000000000000000000000,inf)
  103. sinh(z1) = (0.000000000000000000000000000000000,0.841470984807896506652502321630299)
  104. cosh(z1) = 0.540302305868139717400936607442977
  105. tanh(z1) = (0.000000000000000000000000000000000,1.557407724654902230506974807458360)
  106. asinh(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)
  107. acosh(z1) = (0.881373587019543025232609324979792,1.570796326794896619231321691639751)
  108. atanh(z1) = (0.000000000000000000000000000000000,0.785398163397448309615660845819876)
  109. //]
  110. */