Portál AbcLinuxu, 6. května 2025 15:58

Dotaz: PHP - problem pri generovani cisel

3.2.2023 14:10 tom
PHP - problem pri generovani cisel
Přečteno: 640×
Odpovědět | Admin
Zdravim,

potrebuji vygenerovat cisla od -10 do 10 s krokem 0,1

Napsal jsem si nasledujici jednoduchy kod:
for ($x = -10; $x < 10; $x = $x + 0.1) {
    echo "$x\n";
}
A podivejte co se mi vygeneruje za silenost:
-1.5
-1.4
-1.3
-1.2
-1.1
-1
-0.90000000000002
-0.80000000000002
-0.70000000000002
-0.60000000000002
-0.50000000000002
-0.40000000000002
-0.30000000000002
-0.20000000000002
-0.10000000000002
-1.8790524691781E-14
0.099999999999981
0.19999999999998
0.29999999999998
0.39999999999998
0.49999999999998
0.59999999999998
0.69999999999998
0.79999999999998
0.89999999999998
0.99999999999998
1.1
1.2
1.3
1.4
1.5
Netusi prosim nekdo co delam spatne? Dekuji.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jendа avatar 3.2.2023 14:29 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: PHP - problem pri generovani cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takhle floaty fungují a nic s tím dělat nejde, maximálně můžeš použít "decimal float" pokud ti o to hodně jde a PHP to umí (ale s tím zase třeba nebudou umět pracovat různé knihovny). Jedno z "řešení" je že vypisuješ čísla jenom na nějaký rozumný počet desetinných míst, kolik je skutečně potřeba pro tvoji aplikaci (ve funkcích co umí printf-like formátování je to třeba "%.3f").

0.1 myslím vůbec nejde ve standardních binárních floatech reprezentovat přesně, takže když s tím budeš dál pracovat, budou se ti „nepřesnosti“ ještě víc kumulovat.
Jendа avatar 3.2.2023 14:34 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: PHP - problem pri generovani cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jinak to na co tak trochu narážíš je "numerická stabilita" a zde by například numericky stabilnější řešení bylo mít proměnnou jako celé číslo 10x větší a vždy to vydělit 10, protože takhle se ti chyby kumulují.

Numerické knihovny jako například numpy na tuhle úlohu mají speciální funkce (numpy.linspace, numpy.arange) které jsem doufal že to ošetřují, ale teď jsem si zkusil že np.arange(-10,10,0.1) místo nuly taky dává -3.55271368e-14
Řešení 1× (DaBler)
3.2.2023 14:38 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP - problem pri generovani cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Za to môže: Pohyblivá řádová čárka.

Takže si to generovanie musíš inak napísať. Napr.:
<?php

for($i=-100; $i<=100; $i++)
	echo ($i/10)."\n";
debian.plus@protonmail.com
3.2.2023 14:43 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP - problem pri generovani cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ďalšia pikolka je zaokrúhľovania.

Ak chceš presnosť (doslova), tak sa na výpočty používajú "kalkulačky s ľubovoľnou presnosťou" (napr. program bc).
debian.plus@protonmail.com
4.2.2023 16:25 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP - problem pri generovani cisel
Alebo C kniznicu gmp.
debian.plus@protonmail.com

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.