Autor | Zpráva | ||
---|---|---|---|
Darker Profil |
#1 · Zasláno: 28. 10. 2011, 13:34:20 · Upravil/a: Darker
Generuji hodně moc čísel, a pro některá z nich platí že x+1 na 1/3 vyjde jako celé číslo. V PHP jsem to zkoušel kontrlolovat pomocí %1 - v JS mi 0.3%1 nevyjde nula, zatím co pro libovolné celé číslo to tak je. Proč to v PHP nejde nevím, ale potřebuji aby se to kontrolovalo rychle.
Nejrychlejší co mě zatím napadlo je zaokrouhlení. Metoda zaokrouhlení navíc nefunguje od 60 výše... Nerozumím tomu, ale hle: for($i=1;$i<200;$i++){ $pow=pow($i+1,1/3); //Odmocnuji i+1 if($pow==round($pow)) //pokud jsou shodné po zaokrouhlení echo $i.PHP_EOL; else echo "$i not mersenne - $pow -> " .round($pow)." ergo ".($pow==round($pow)?"equals":"different")."\n"; //Tady jsem zkoušel debug, a mrkněte dole co z toho krámu vypadlo! } 26 not mersenne - 3 -> 3 ergo equals 27 not mersenne - 3.0365889718757 -> 3 ergo different ... 62 not mersenne - 3.9790572078964 -> 4 ergo different 63 not mersenne - 4 -> 4 ergo different Co to má být? |
||
Joker Profil |
#2 · Zasláno: 28. 10. 2011, 14:05:05
Darker:
„Co to má být?“ Reprezentace čísel v plovoucí desetinné čárce. Viz také Výsledkem výpočtu 1 - 0.9 není přesně 0.1 (sice to je v JavaScriptové sekci, ale tohle platí obecně pro většinu programovacích jazyků) Funkce pow vrací v případě že výsledek je celé číslo int, takže by snad stačilo: if(is_int($pow)) |
||
Darker Profil |
#3 · Zasláno: 28. 10. 2011, 16:41:41 · Upravil/a: Darker
Joker:
„Výsledkem výpočtu 1 - 0.9 není přesně 0.1“ To znám jenže tady jsem porovnával 3odmocninu z 81 s round(3odmocnina ze 81). A pro 27 to fungovalo (1 řádek). „if(is_int($pow))“ Pro $pow=pow($i+1,1/3); |
||
H13 Profil |
#4 · Zasláno: 28. 10. 2011, 17:36:26 · Upravil/a: H13
Tohle:
if(number_format($pow,11,'.','') ==number_format(round($pow),11,'.','')) se oproti: if($pow==round($pow)) chová 'korektně', ale asi to nebude to, co hledáš? :-) |
||
Marek88 Profil |
#5 · Zasláno: 28. 10. 2011, 18:41:49 · Upravil/a: Marek88
Darker:
„To znám jenže...“ A to tě nenapadlo, že ten problém není jen s 1-0.9, ale se všemi desetinnými čísly? U mě se to (kdo ví proč) děje až u třetí odmocniny ze 125 (to, že to u nějakých čísel funguje, je "náhoda" a nelze na to spoléhat). |
||
Darker Profil |
#6 · Zasláno: 30. 10. 2011, 09:43:09
Marek88:
„děje až u třetí odmocniny ze 125“ Mě blbne až čtvrtá :) |
||
Časová prodleva: 12 let
|
0