Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <boost/multiprecision/cpp_int.hpp> // kokonaisluvut
- #include <boost/multiprecision/mpfr.hpp> // liukuluvut
- // kääntäjän komentorivi ohjelman xxxxx.cpp-lähdekoodin hakemistossa:
- // g++ -O3 -std=gnu++17 boost_examples.cpp -I/c/boost/multiprecision -lquadmath -lmpfr -o boost_examples.exe
- // Juhani Kaukoranta 3.7.2020
- int main()
- {
- namespace mp = boost::multiprecision; // lyhennysmerkitä mp
- // int128_t , int256_t , int512_t , int1024_t , uint128_t , uint256_t jne eli kokonaisluvut
- mp::uint256_t isokokluku("123456789012345678901234567890"); // suurinumeroisen muuttujan isokokluku alustus
- mp::int128_t a = 2; //pienikokoinen muuttuja voidaan antaa näin
- mp::uint128_t isoluku; // muuttujan määritteleminen ilman arvoa
- std::cout << "anna isoluku 123456789012345678901234567890 " << std::endl;
- std::cin >> isoluku; // muuttujan arvon antaminen komentoriviltä
- std ::cout << "isoluku = " << isokokluku << std::endl; // tulostus komentoriville
- std ::cout << "isokokluku = " << isokokluku << std::endl;
- mp::int256_t taxicabnumber;
- std::cout << "Anna taxicabnumber Ta(7) = 24885189317885898975235988544 " << std::endl;
- std::cin >> taxicabnumber;
- std::cout << "isokokluku % 17 = " << isokokluku % 17 << std::endl;
- std :: cout << "isoluku % 19 = " << isoluku % 19 << std::endl;
- std ::cout << "a*a*a*a*a = " << a*a*a*a*a << std::endl; // 128-bittisen muuttuja
- // liukuluvut mpfr_float_50 , mpfr_float_100 , mpfr_float_500 . mpfr_float1000
- // liukuluvut 50, 100, 500 ja 1000 numeron tarkkuudella
- // mpfr_float on noin 2x nopeampi kuin cpp_dec_float, joten käytetään vain mpfr-kirjastoa
- mp::mpfr_float_100 test = 24153319581254312065344.0;
- mp::mpfr_float_100 bfr = 2; // määritellään 100-numeroisen muuttuja bfr:n arvoksi liukuluku 2
- // mpr_float_100 -liukulukumuuttujat lasketaan ja tulostetaan täydellä 100 numeron tarkkuudella:
- std::cout << std::setprecision(std::numeric_limits<mp::mpfr_float_100>::max_digits10) << std::endl;
- // vertailun vuoksi neliöjuuri(2) ja kuutiojuuri(2) suurella tarkkuudella
- std::cout << "wolfram: sqrt(2) = 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091" << std::endl;
- std::cout << "wolfram cubicroot(2) = 1.25992104989487316476721060727822835057025146470150798008197511215529967651395948372939656243625509415431025603561..." << std::endl;
- // tulostus maksimitarkuudella eli mpfr_float_100 tulostuu 100-numerolla
- // Laskuissa voi käyttää sekä C++ std lib funktioita (esim sqrt ) että boost-funktioita (esim mp::sqrt )
- std::cout << "tulostus 100 numeron tarkkuudella " << std::endl;
- std::cout << "neliöjuuri(2) = sqrt(bfr) = " << sqrt(bfr) << std::endl; // käyttää C++ std lib sqrt
- std::cout << "neliöjuuri(2) = mp::sqrt(bfr) = " << mp::sqrt(bfr) << std::endl; // käyttää boost sqrt
- std::cout << "kuutiojuuri(2) = mp::cbrt(bfr) = " << mp::cbrt(bfr) << std::endl; // käyttää boost cbrt
- mp::mpfr_float_100 isoliuku = 123456789012345678901234567890.0;
- std::cout << "isoliuku = 123456789012345678901234567890.0" << std::endl;
- std::cout << "cbrt(isoliuku) = " << cbrt(isoliuku) << std::endl; // C++ std lib cbrt
- std::cout << "mp:cbrt(isoliuku) = " << mp::cbrt(isoliuku) << std::endl; // boost lib cbrt
- std::cout << "sqrt(test) = " << sqrt(test) << std::endl;
- std::cout << "luonnonllinen logaritmi luvusta 2 = log(bfr) = " << log(bfr) << std::endl; // käyttää C++ std lib log
- // Funktion argumentti voi olla myös lauseke:
- std::cout << "boost::math::tgamma(bfr*bfr) = " << mp::tgamma(bfr * bfr) << std::endl;
- // kokonaisluku voidaan muuntaa liukuluvuksi, jos funktio vaatii argumentiksi liukulukua (esim pow-potenssiinkorotus)
- mp::int128_t raja, raja2; // määritellään 128-bittiset kokonaisluvut raja,raja2 eli noin 38-numeroiset kokonaisluvut
- // muunnetaan 256-bittinen kokonaisluku taxicabnumber 100-numeroiseksi liukuluvuksi taxi
- // jolloin voidaan ottaa kuutiojuuri taxicabnumberia vastaavasti liukuluvusta taxi:
- mp::mpfr_float_100 taxi = taxicabnumber.convert_to<mp::mpfr_float_100>(); // taxicabnumer -> 100-numeroiseksi floatiksi
- raja = (mp::pow(taxi,1/3.0) +0.5).convert_to<mp::int128_t>(); // kuutiojuuri(taxi) -> 128-bittiseksi kokonaisluvuksi
- raja2= (mp::cbrt(taxi) +0.5).convert_to<mp::int128_t>(); // kuutiojuuri(taxi) -> 128-bittiseksi kokonaisluvuksi
- std::cout << "pow-funktiona avulla raja = " << raja << std::endl; // tulostetaan raja, joka saatiin pow-funktiolla
- std::cout << "cbrt-funktion avulla raja2 = " << raja2 << std::endl; // tulostetaan raja2, joka saatii cbrt-funktiolla. pitäisi olla sama tulos
- // 500 numeron tarkuudella luku sqrt(2) eli neliöjuuri(2)
- mp::mpfr_float_500 cfr500 = 2; // määritellään muuttujan cfr500 arvoksi 2 boost-tyypin mpfr_float_500 avulla
- std::cout << std::setprecision(std::numeric_limits<mp::mpfr_float_500>::max_digits10) << std::endl; // tulostus maksimitarkkuudella
- std::cout << "neliöjuuri(2) 500 numeron tarkkuudella: " << std::endl;
- std::cout << "mp::sqrt(cfr500) = " << mp::sqrt(cfr500) << std::endl; // boost sqrt
- }
Advertisement
Add Comment
Please, Sign In to add comment