Autor Zpráva
Jiří Bureš
Profil *
Pomocí PHP se pokouším počítat s velkými resp. téměř nulovými čísly. PHP má při výpočtech typu $vysledek=1/0.000000000000001 problém se zobrazením správného výsledku. Místo hezkého čísla typu 1000... se vypíše 999... (problém s výpočty ve float + související je mi docela jasný).

Hledal jsem silnější matematický aparát v PHP a narazil jsem mj. na BCMath. Problém ale nastal, když jsem použil funkci bcdiv. Např. bcdiv(1,9.4605E+15,18) vyhazuje hlášku o dělení nulou. Tohle ale není úplně pravda. ;-) Zkoušel jsem různá nastavení (např. s bcscale(něco)), ale výsledek se nedostavil. bcdiv() se zasekl dřív, než skolabovalo PHP se standardním Math aparátem.

Máte někdo zkušenost s matematickými operacemi toho typu, který jsem uvedl výše? Popostrčte mě. Díky.
Jiří Bureš
Profil *
Odpovím si částečně sám. Vstupem do BCMath musí být (skutečný) řetězec. Pak to počítá hezky. Takže musím číslo převést na řetězec. Trochu problém mi dělá, že některé hodnoty se převedou na zápis 1E+15, 2.543E-5 atp. Pak to háže chybu dělení nulou.

Takže ještě musím vyřešit otázku, jak přimět PHP, aby výše uvedené "E" zápisy převedl do řetězce typu "1000000000000000" resp. "0,00002543". Poradí někdo?
nightfish
Profil
Takže ještě musím vyřešit otázku, jak přimět PHP, aby výše uvedené "E" zápisy převedl do řetězce typu "1000000000000000" resp. "0,00002543". Poradí někdo?
http://cz.php.net/sprintf
Jiří Bureš
Profil *
sprint je zajímavý. Dík za tip. Ale asi to taky nebude ono, protože sprintf("%.27f", ,"0.3048"); vrací 0.304800000000000004263256415 (přece jenom to asi bere "číselně" - viz mé #1).

Podle všeho budu muset exponenciální zápisy čísel rozprarsovat a pak seskládat sám. :-(
blaaablaaa
Profil
Jiří Bureš
http://steve.hollasch.net/cgindex/coding/ieeefloat.html dle ulozeni floatoveho cisla ani nejspis neni mozne jej pres sprintf takto prevest, ale muzu se mylit, zkus prolezt diskuzi v manualu, mozna neco najdes
Jiří Bureš
Profil *
To blaaablaaa) To je přesně to, co jsem psal v úvodu. Tj. "problém s výpočty ve float + související je mi docela jasný". Já naštěstí budu řešit jen převody typu 1E+15, 2.54E-6 atp. na řetězce, takže by to neměl být problém. Už mám rozpracovanou funkci, kde zmíněná "čísla" rozsekám na mantisu, desetinnou část a exponent a přidělám k tomu nuly (zezadu resp. zepředu). To by mělo fungovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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