Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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. května 22:06
 
Odpovědět 13. května 22:03
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Ondřej Krsička
Drahomír Hanák:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 13. května 23:22
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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. května 13:01
 
Nahoru Odpovědět 14. května 12:59
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Ondřej Krsička
Drahomír Hanák:

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

 
Nahoru Odpovědět 14. května 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.