Záhadná chyba v jednoduchém výpočtu   zodpovězená otázka

C#, Algoritmy, .NET

Netušíte, proč mi tento výpočet v C# vychází 0, když to musí podle kalkulačky vyjít 1:

label1.Text = Convert.ToString( Math.Pow(11, 17 - 1) % 17);

Už si s tím nevím rady...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Windows Kalkulačka také vypočítá 0, nebude chyba v nepřesnosti vaší kalkulačky?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mi Windows kalkulačka vypočítá 1. Pro kontrolu:

11^16 = 45949729863572161

45949729863572161 mod 17 = 1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha! Tak v tom případě je chyba v nepřesnosti nebo zaokrouhlování .NET Frameworku. Pow(11, 16) totiž vrací 45949729863572160 (což jsem také použil jako data pro mod na Windows Kalkulačce) místo 45949729863572161 a proto vychází 0 místo 1. Obávám se, že s tím nepůjde nic udělat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Sakra...

Ale je zajímavé, že (16^16)%17 funguje správně a to je o dost větší číslo. Nefunguje jen (11^16) a (13^16). Všechny ostatní 1 až 16 fungují :(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nemůže to být tím, že 16^16 je 1 a pak hejno nul, takže se ve formátu IEEE 754 uloží přesně? Nezapomeňte, že se to vše ukládá binárně, jak to vypadá v desítkovém zápisu, je irelevantní.

Možná se pletu, je tipuju

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste ta čísla přetypovat na Decimal, pokud se to do něj vejde, bude to přesnější. Nebo pokud se to vejde do Longu, tak to Math.Pow změňte na For cyklus, u celočíselných zaokrouhlovací chyby nejsou. Záleží ovšem, jestli se to tam vejde.

Zrovna modulo mocniny by se dalo počítat trochu chytřeji, ale to chce znalosti z algebry, kterou jsem již poněkud zapomněl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Včera jsem si udělal vlastní pow pomocí cyklu a longu. U některých čísel to pomohlo, ale i tak jsem narážel na hranici datového typu.

Nakonec jsem to udělal metodou Modular exponentiation, která nějak najednou dělá jak mod i pow. Výsledky se neženou do takových velikostí jako u samotného pow, je to přesné a rychlé i pro velká čísla.

http://en.wikipedia.org/wiki/Modular_exp...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback