jukaukor

boost_examples.cpp

Jul 3rd, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <boost/multiprecision/cpp_int.hpp> // kokonaisluvut
  4. #include <boost/multiprecision/mpfr.hpp> // liukuluvut
  5.  
  6. // kääntäjän komentorivi ohjelman xxxxx.cpp-lähdekoodin hakemistossa:
  7. // g++ -O3 -std=gnu++17 boost_examples.cpp -I/c/boost/multiprecision -lquadmath -lmpfr -o boost_examples.exe
  8.  
  9.  
  10. // Juhani Kaukoranta 3.7.2020
  11.  
  12. int main()
  13. {
  14. namespace mp = boost::multiprecision; // lyhennysmerkitä mp
  15.  
  16. // int128_t , int256_t , int512_t , int1024_t , uint128_t , uint256_t jne eli kokonaisluvut
  17.  
  18. mp::uint256_t isokokluku("123456789012345678901234567890"); // suurinumeroisen muuttujan isokokluku alustus
  19. mp::int128_t a = 2; //pienikokoinen muuttuja voidaan antaa näin
  20. mp::uint128_t isoluku; // muuttujan määritteleminen ilman arvoa
  21. std::cout << "anna isoluku 123456789012345678901234567890 " << std::endl;
  22. std::cin >> isoluku; // muuttujan arvon antaminen komentoriviltä
  23. std ::cout << "isoluku = " << isokokluku << std::endl; // tulostus komentoriville
  24. std ::cout << "isokokluku = " << isokokluku << std::endl;
  25. mp::int256_t taxicabnumber;
  26. std::cout << "Anna taxicabnumber Ta(7) = 24885189317885898975235988544 " << std::endl;
  27. std::cin >> taxicabnumber;
  28. std::cout << "isokokluku % 17 = " << isokokluku % 17 << std::endl;
  29. std :: cout << "isoluku % 19 = " << isoluku % 19 << std::endl;
  30. std ::cout << "a*a*a*a*a = " << a*a*a*a*a << std::endl; // 128-bittisen muuttuja
  31.  
  32. // liukuluvut mpfr_float_50 , mpfr_float_100 , mpfr_float_500 . mpfr_float1000
  33. // liukuluvut 50, 100, 500 ja 1000 numeron tarkkuudella
  34. // mpfr_float on noin 2x nopeampi kuin cpp_dec_float, joten käytetään vain mpfr-kirjastoa
  35.  
  36.  
  37. mp::mpfr_float_100 test = 24153319581254312065344.0;
  38. mp::mpfr_float_100 bfr = 2; // määritellään 100-numeroisen muuttuja bfr:n arvoksi liukuluku 2
  39.  
  40. // mpr_float_100 -liukulukumuuttujat lasketaan ja tulostetaan täydellä 100 numeron tarkkuudella:
  41. std::cout << std::setprecision(std::numeric_limits<mp::mpfr_float_100>::max_digits10) << std::endl;
  42.  
  43. // vertailun vuoksi neliöjuuri(2) ja kuutiojuuri(2) suurella tarkkuudella
  44. std::cout << "wolfram: sqrt(2) = 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091" << std::endl;
  45. std::cout << "wolfram cubicroot(2) = 1.25992104989487316476721060727822835057025146470150798008197511215529967651395948372939656243625509415431025603561..." << std::endl;
  46.  
  47. // tulostus maksimitarkuudella eli mpfr_float_100 tulostuu 100-numerolla
  48. // Laskuissa voi käyttää sekä C++ std lib funktioita (esim sqrt ) että boost-funktioita (esim mp::sqrt )
  49.  
  50. std::cout << "tulostus 100 numeron tarkkuudella " << std::endl;
  51. std::cout << "neliöjuuri(2) = sqrt(bfr) = " << sqrt(bfr) << std::endl; // käyttää C++ std lib sqrt
  52. std::cout << "neliöjuuri(2) = mp::sqrt(bfr) = " << mp::sqrt(bfr) << std::endl; // käyttää boost sqrt
  53. std::cout << "kuutiojuuri(2) = mp::cbrt(bfr) = " << mp::cbrt(bfr) << std::endl; // käyttää boost cbrt
  54. mp::mpfr_float_100 isoliuku = 123456789012345678901234567890.0;
  55. std::cout << "isoliuku = 123456789012345678901234567890.0" << std::endl;
  56. std::cout << "cbrt(isoliuku) = " << cbrt(isoliuku) << std::endl; // C++ std lib cbrt
  57. std::cout << "mp:cbrt(isoliuku) = " << mp::cbrt(isoliuku) << std::endl; // boost lib cbrt
  58. std::cout << "sqrt(test) = " << sqrt(test) << std::endl;
  59. std::cout << "luonnonllinen logaritmi luvusta 2 = log(bfr) = " << log(bfr) << std::endl; // käyttää C++ std lib log
  60. // Funktion argumentti voi olla myös lauseke:
  61. std::cout << "boost::math::tgamma(bfr*bfr) = " << mp::tgamma(bfr * bfr) << std::endl;
  62.  
  63. // kokonaisluku voidaan muuntaa liukuluvuksi, jos funktio vaatii argumentiksi liukulukua (esim pow-potenssiinkorotus)
  64.  
  65. mp::int128_t raja, raja2; // määritellään 128-bittiset kokonaisluvut raja,raja2 eli noin 38-numeroiset kokonaisluvut
  66. // muunnetaan 256-bittinen kokonaisluku taxicabnumber 100-numeroiseksi liukuluvuksi taxi
  67. // jolloin voidaan ottaa kuutiojuuri taxicabnumberia vastaavasti liukuluvusta taxi:
  68. mp::mpfr_float_100 taxi = taxicabnumber.convert_to<mp::mpfr_float_100>(); // taxicabnumer -> 100-numeroiseksi floatiksi
  69. raja = (mp::pow(taxi,1/3.0) +0.5).convert_to<mp::int128_t>(); // kuutiojuuri(taxi) -> 128-bittiseksi kokonaisluvuksi
  70. raja2= (mp::cbrt(taxi) +0.5).convert_to<mp::int128_t>(); // kuutiojuuri(taxi) -> 128-bittiseksi kokonaisluvuksi
  71. std::cout << "pow-funktiona avulla raja = " << raja << std::endl; // tulostetaan raja, joka saatiin pow-funktiolla
  72. std::cout << "cbrt-funktion avulla raja2 = " << raja2 << std::endl; // tulostetaan raja2, joka saatii cbrt-funktiolla. pitäisi olla sama tulos
  73.  
  74. // 500 numeron tarkuudella luku sqrt(2) eli neliöjuuri(2)
  75. mp::mpfr_float_500 cfr500 = 2; // määritellään muuttujan cfr500 arvoksi 2 boost-tyypin mpfr_float_500 avulla
  76. std::cout << std::setprecision(std::numeric_limits<mp::mpfr_float_500>::max_digits10) << std::endl; // tulostus maksimitarkkuudella
  77. std::cout << "neliöjuuri(2) 500 numeron tarkkuudella: " << std::endl;
  78. std::cout << "mp::sqrt(cfr500) = " << mp::sqrt(cfr500) << std::endl; // boost sqrt
  79.  
  80. }
Advertisement
Add Comment
Please, Sign In to add comment