Jak spočítat přesně a spolehlivě n-tou odmocninu pro celé n? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak spočítat přesně a spolehlivě n-tou odmocninu pro celé n? – C / C++ – Fórum – Programujte.comJak spočítat přesně a spolehlivě n-tou odmocninu pro celé n? – C / C++ – Fórum – Programujte.com

 

Clock
~ Anonymní uživatel
5 příspěvků
30. 3. 2008   #1
-
0
-

Následující kód by měl v proměnných y a z vrátit zpět hodnotu u,
výsledek je ovšem zatížen relativní chybou asi 1.27e-15.
Jak přesnost pro celá n zlepšit, aby relativní chyba výsledku
byla na úrovni 2.2e-16, jak je to třeba při násobení nebo dělení?
Nevím jestli by to mohlo být závislé na překladači, používám VS8.0

double u = 4238549808285.3003;

double x = u * u * u;

double n = 3.0;
double y = pow( x, 1.0 / n );
//y = 4238549808285.2935

double z = exp( log( x ) / n );
//z = 4238549808285.2949


Editoval midin: Zdrojáky do tagu code.

Nahlásit jako SPAM
IP: 85.71.59.–
Mixxy
~ Anonymní uživatel
179 příspěvků
11. 4. 2008   #2
-
0
-

Co treba pouzit long double? Pouzival jsem long double pri projektech a maji lepsi presnost;)

Nahlásit jako SPAM
IP: 147.229.88.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
15. 4. 2008   #3
-
0
-

To Mixxy :
Díky za odpověď. Trochu jsem pátral a problém je v tom, že podpora pro long double asi nejde ve VC8 zapnout. Vypadá to, že long double se mapuje na double, viz http://blogs.msdn.com/ericflee/archive/2004/06/10/152852.aspx
Zkusil jsem použít long double prototypy funkcí powl, expl, logl dle
http://msdn2.microsoft.com/en-us/library/9cx8xs15.aspx, ale bez úspěchu.
V tuto chvíli vidím čtyři řešení:
- použít jiný překladač, který nativně podporuje long double,
- zkusit některou z knihoven pro volitelnou přesnost výpočtu, např. GMP,
- odmocninu naprogramovat v assembleru a tím ztratit přenositelnost,
- použít jeden krok Newtonovy metody s rizikem, že nesplním podmínky konvergence a přesnost se může i zhoršit.

Pro mě nejlíp připadá v úvahu poslední možnost, takže jsem zkusil do výše uvedeného zdrojáku přidat následující řádek, zkusil i jiné odmocniny a zatím to vypadá v pořádku.

y = y - ( pow( y, n ) - x ) / pow( y, n - 1 ) / n;

//y = 4238549808285.3003;

Nahlásit jako SPAM
IP: 147.229.145.–
Mixxy
~ Anonymní uživatel
179 příspěvků
20. 4. 2008   #4
-
0
-

Taky možnost.

Nahlásit jako SPAM
IP: 85.13.122.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 68 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý