Autor Zpráva
Darker
Profil
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
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
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);
je is_int($pow) vždycky false (pro $i 1-100). (už jsem taky zkoušel (int)$pow===$pow)
H13
Profil
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
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
Marek88:
děje až u třetí odmocniny ze 125
Mě blbne až čtvrtá :)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0