• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dokładność pierwiastka z liczby

Object Storage Arubacloud
0 głosów
544 wizyt
pytanie zadane 15 sierpnia 2020 w C i C++ przez tothk2a11 Początkujący (290 p.)
edycja 15 sierpnia 2020 przez tothk2a11

Witam,

Szukam metody którą można policzyć pierwiastek danej liczby z dokładnością do 13 miejsc po przecinku.

Są jest jakaś funkcja w standardowych bibliotekach która policzy pierwiastek i poda wynik z określoną dokładnością.

Zazwyczaj korzystam z funkcji:  
 

pow( liczba  ,  ( 1/ stopimeńPierwiastka ) )



Ale w tym przypadku nie mam wpływu na ilość otrzymanych liczb po przecinku.

Jest jakaś funkcja w bibliotece <cmath> która da wynik z określoną liczbą cyfr po przecinku???

Czy będę musiał napisać coś działające na podstawie metody Newtona i wyznaczyć najlepsze przybliżenie, mniejsze o jeden rząd wielkość od szukanej liczby.

2 odpowiedzi

0 głosów
odpowiedź 15 sierpnia 2020 przez Wiciorny Ekspert (270,150 p.)
biblioteki metod numerycznych i zmienne typu float/double
0 głosów
odpowiedź 15 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)

Ale w tym przypadku nie mam wpływu na ilość otrzymanych liczb po przecinku.

Wyjaśnij.

double ma precyzję do około 16 cyfr, więc powinno wystarczyć, a zaokrąglić wynik to chyba nie problem. 

Możesz napisać bardzo prosto pierwiastek używając wyszukiwania binarnego. 

komentarz 15 sierpnia 2020 przez tothk2a11 Początkujący (290 p.)
edycja 16 sierpnia 2020 przez tothk2a11

używając funkcji:

pow( liczba  ,  ( 1/ stopimeńPierwiastka ) )

zwraca mi wynik z dokładnością do 6 miejsc po przecinku. Niezależnie od rodzaju zmiennej - choć zazwyczaj przy dużych liczbach używam long double.

Co do wyszukiwania binarnego to się nie znam - jak masz jakiś przykładowego kodu to z chęciom się przyjże.

 

 

 

 

1
komentarz 16 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)
double pierwiastek2(double val, double min=0, double max=1, eps=0.000001){
 double a=min, b=max;
 while(abs(a-b) > eps){
  double mid = (b+a)/2;
  double mid2 = mid*mid; /// dla stopnia 3 dolozyc *mid i analogicznie dla wiekszych
  if(mid2 > val) b = mid;
  else a=mid;
 }
 return a;
}

Pisane z ręki więc nie wiem czy działa.

I nie zaszkodzi zmienić double na long double

komentarz 16 sierpnia 2020 przez tothk2a11 Początkujący (290 p.)
przywrócone 16 sierpnia 2020 przez tothk2a11

Powyższy kod pewnie dział. Przerabiałem ten sam algorytm z identyczną strukturą. Ale okazało się że problem leży gdzieś indziej.

Problem stanowił standardowe ograniczenie liczb zmiennoprzecinkowych do 6 cyfr po przecinku w trakcie przesyłania poprzez strumień.

Wyświetlenie liczby zmiennoprzecinkowej w konsoli lub zapisanie jej w plik powoduje obcięcie otrzymanej wartości do 6 znaków po przecinku.

Sprawa wyjaśniona!!!

Rozwiązaniem tego problemu jest użycie odpowiedniego manipulatora strumienia danych.

#include <iomanip>

cout << setprecision(ilośćMiejscPoPrzecinku) << fixed;

plik << setprecision(ilośćMiejscPoPrzecinku) << fixed;

Funkcja 

pow( liczba  ,  ( 1/ stopimeńPierwiastka ) )

też działa z dowolną zadaną dokładnością. Na zmiennych typu long double można otrzymać wynik obliczeń z dokładnością do 50 miejsc po przecinku.

 

Podobne pytania

0 głosów
1 odpowiedź 405 wizyt
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 22 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...