Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondřej Krsička:13.5.2016 22:03

Ahoj,
když v C# Interactive zadám

Console.WriteLine(Math.Pow(64, 1.0 / 3.0));

, vypíše se mi 4. Pokud to ale uložím do proměnné a pak až vypíšu, ukáže se mi 3,99999999999­99996.
Můžu

double d = Math.Pow(64, 1.0 / 3.0);
if (d % 1 == 0) //Vyjde false, ikdyž matematicky má vyjít true
        //....
if (pole.Contains(d)
        //...

nahradit tímto:

if (Math.Pow(64, 1.0 / 3.0) % 1 == 0)
        //....
if (pole.Contains(Math.Pow(64, 1.0 / 3.0))
        //...

, pokud mám takovéto instrukce v cyklu o stovkách, možná tisících opakování? Nezpomalí se program moc?
Jde mi o to, že uložení do proměnné je efektivnější než znovu to počítat.
Jak jinak bych to mohl vyřešit?

EDIT: Tu proměnnou d tam využívám celkem pětkrát, o to horší by byla ta druhá možnost.

Editováno 13.5.2016 22:06
 
Odpovědět
13.5.2016 22:03
Avatar
Odpovídá na Ondřej Krsička
Drahomír Hanák:13.5.2016 23:22

K přesnosti typu double: podívej se na to, jak počítač reprezentuje double a jak se pracuje s čísly s pohyblivou řádovou čárkou (viz https://www.youtube.com/watch?… a http://floating-point-gui.de/).

Mocněním v cyklu se program moc nezpomalí. Nicméně uložit si opakující se část výpočtu do proměnné je vždy dobrý nápad už jen kvůli přehlednosti. Složitost záleží ještě na velikosti pole a implementaci pole.Contains Pokud tahle metoda prochází lineárně prvky pole, tak můžeš v nejhorším případě provést řádově až délka pole * počet cyklů operací. Jestli je obojí (délka pole i počet cyklů) v řádů stovek, pak to nebude vadit.

Alternativní řešení nepřesnosti záleží na problému. Například pokud počítáš jen 3. odmocniny čísel a v poli jsou jen celá čísla (resp. jejich třetí mocnina je celé číslo), pak je do pole stačí ukládat ve třetí mocnině. V takovém případě můžeš místo double použít celá čísla (místo pole.Contains(Math.Pow(64, 1.0 / 3.0) stačí zavolat jen pole.Contains(64)).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
13.5.2016 23:22
Avatar
Ondřej Krsička:14.5.2016 12:59

Díky za zajímavý příspěvek, na druhém odkazu je to skvěle vysvětlené :)
Nakonec jsem to trochu obešel a v KSP-Z z úlohy Mocniny mám 7 z 10 :D (Moc se mi nechce zjišťovat, proč jen 7.)

if (d % 1 > 0.99999 || d % 1 < 0.00001 ||d % 1 == 0)
        //.....
Editováno 14.5.2016 13:01
 
Nahoru Odpovědět
14.5.2016 12:59
Avatar
Odpovídá na Ondřej Krsička
Drahomír Hanák:14.5.2016 21:21

V té úloze nemusíš vůbec používat double, vystačíš si s celými čísly. ;)

 
Nahoru Odpovědět
14.5.2016 21:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.