Diskuze: Goniometrické funkce
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ještě jsem zapomněl napsat co mi tam nefunguje a s čím vlastně
potřebuju poradit. Úhel funguje pouze do 90° potom hází chybný informace a
funkce kromě sinusu taky ukazujou blbosti, ale vůbec netuším proč
Zkoušel jsem to spustit a ukazuje to jiný čísla než kalkulačka
Máš nějaký konkrétní hodnoy, které jsou špatně?
Jaký úhel? Jaká funkce? Jaká hodnota z programu? Jaká hodnota z kalkulačky?
Všechny funkce jsem pořádně vyzkoušel a zjistil jsem že fungují, kromě toho když má být výsledek 0 nebo nekonečno. Tím mám na mysli např. sin 180°,sin 0°,cos 90°,tg 90°,atd. Nevím jakým příkazem tomu pomoci aby i tyto funkce ukazovali správnou hodnotu 0.
Ten výsledek není přesně 0, ale třeba
0,000000000000000122460635382238, protože procesory nemají přesnou
goniometrickou funkci, ale jen jejich aproximaci ... takže by ti mělo stačit
ten výsledek zaokrouhlit na nějaký počet des míst
Funkce sinus a cosinus by měly fungoval pro libovolný úhel. Zrovna tak výsledke nula bude ok. To si pořádně ověř, v tom problém nebude.
Problém je ale s funkcí tangens, resp. cotangens. Ta z matematického hlediska není pro některé úhly definovaná. Ona se totiž nechá spočítat takhle:
tan(uhel) = sin(uhel) / cos(uhel)
A tady nastává problém v okamžiku, kdy cos(uhel) == 0, protože dělení nulou.
Jedna z možností, jak to řešit, je třeba ověřit si, že cosinus toho uhlu není 0. Pokud je, tak vypsat něco ve smyslo, že pro tenhle úhel není funkce tangens definovaná.
Cotangens funguje obdobně. Jen tam na nulu nebudeš ověřovat cosinus, ale sinus.
Ano, výsledek mi vždy vyjde 1,12...... na - 16tou, takže stačí zaokrouhlit. Děkuju za radu.
Hele s tangens mi ale normálně funguje, teda až na to nekonečno. Math.Tan() funguje spolehlivě a cotangens jsem v počítal 1/tangens. Ještě vyzkouším tvůj způsob. Ještě vymyslet příkaz který zjistí kdy je cos úhlu nula.
Přiznávám, goneometrické funkce v dotnetu snad vůbec nepoužívám, takže neznám jejich chování kromě toho, co se píše v dokumentaci.
Hádám, že pro nedefinovaný úhly to vrací double.NaN , popř. nějakou šíleně velkou nebo malou hodnotu, protože to vlivem nepřesnosti doublu zrovna tak vychází. Takže by možná stačílo kontrolovat, jestli tangens nevrací NaN...
To, co jsem psal, spíš vychází z toho, co si pamatuju z matematiky ze školy.
Každopádně to, na co jsi se nepřímo ptal, byla opravdu nepřesenost
doublu. To mě vůbec nenapadlo na to upozornit - ze zkušenosti vím, že tyhle
chyby fakticky vadí jen když počítáš peníze
Děkuju za všechny rady. Nastavil jsem tam zaokrouhlování takže už mi to
ukazuje i 0. Ještě poslední otázka . Dalo by se nějak nastavit
abych se z určitého místa vrátil zpět na určité místo. V mém zadání
by to znamenalo to, že kdyby uživatel nevybral ani jednu z funkcí ale napsal
by např. 5 tak aby na něj vyskočila věta "Zadej prosím znovu a správně
číslo funkce" a vrátilo by ho to zpět na výběr funkcí?
Dalo by se nějak nastavit abych se z určitého místa vrátil zpět na určité místo.
Takhle se vysloveně ptáš na jednu fičůru, která je snad i v C#, ale je tak trochu tabu. V rozáhlejším programu je to totiž cesta do pekla.
Takže popíšu obvyklé řešení:
Tyhle věci se bežně řeší cyklem. Cyklus je něco, co ti opakovaně spouští nějaký kód, dokud je splněna nějaká podmínka. Existuje několik druhů cyklů. V tomhle případě by se nabízelo to celé strčit do do-while. Tam se podmínka ověřuje až na konci, takže cyklus proběhne alespoň jednou. Takže stačí zajistit, aby podmínka byla splněna, pokud uživatel zadá neplatnou hodnotu.
do
{
// kod, ktery opakovat
} while(podminka);
takže mezi to "do" a "while" mam dát úplně celý program
Ano, to je asi nejjednodušší.
Alternativně můžeš celý program vyseparovat do funkce vedle a do cyklu dát jen volání funkce.
A ještě alternativně: můžeš ověřit, že uživatel zadal číslo v očekávaném rozsahu před tím, než to celé spuštíš.
Děkuju, zvolím nejjednodušší metodu. Hodím před volbou funkce to "do"
a nakonec "while". Díky za všechny rady
Zobrazeno 16 zpráv z 16.