Free Pascalban a következő kifejezés értéke miért nem igaz? Rosszul számol a Free Pascal?
Ki lehet próbálni, 0-nak kellene lennie!
((8/27)*(8/27)) - ((4/9)*(4/9)*(4/9))=0;
Levezetve:
64/729 - 64/729 = 0
Lehet azért mert ingyenes?
Váó.
Na ezért keresek én szoftverfejlesztőként sokat.
A PHP és a Pascal két elég különböző világ. A Pascal ún. erősen típusos nyelv, a PHP pedig dinamikus típusrendszert használ. Ebből fakadóan vannak komoly eltérések például a számolásban.
Pascal-ban az osztás eredménye mindig real típusú, aminek a pontossága a célplatformtól függ (4 vagy 8 bájt széles) Három dolgot kell tudnod: az egyik, hogy ezek ún. lebegőpontos számok. Ez azt jelenti, hogy a számot kettes számrendszerbeli normálalakban írjuk fel, vagyis egy nulla és egy közötti tört és kettő valahányadik hatványának a szorzata. A másik, hogy kettes számrendszerben sokkal több a végtelen tört, mint tízes számrendszerben, ezért a törtek átváltásai pontatlanságokat okoznak. A harmadik, hogy a fentiek miatt valós (lebegőpontos) számok összeadását mindig a legkisebb értékekkel kezdjük, és haladunk a nagyobbak felé, mert így a legkisebb a pontosság-vesztés.
Van egy másik lehetőség, a decimális típus (Pascal-ban Currency). Ezt kell olyankor használni, amikor a fenti kerekítési problémák nem elfogadhatóak, vagyis tipikusan akkor, amikor pénzről van szó.
Megjegyzem, a PHP 8 bájtos lebegőpontos számokat használ, bár szintén platform függő. Illetve az is kérdés, hogyan optimalizál a fordító (.Net explicit singe típussal szintén nullát ad, Mac saját számológépe viszont nem)
Te nem tudsz számolni.
Nem fogod fel ember, hogy ez számítógép, és nem ember?
Hogyan írod be memóriába 32 bitre, hogy ez egy végtelen szakaszos tört???
neked van 32 db 0 vagy 1-es, ezzel kell dolgoznod.
Olvass már utána a lebegőpontos számoknak!
És ez nem a "Pascal hibája", minden típusos nyelvnél így van.
#13 - Az egy dolog, hogy te papíron, ceruzával 10-es számrendszerben meg tudod oldani. Az meg egy másik, hogy erre egy gép képes bináris számrendszerben. Nem véletlen írtam azt, hogy "végtelen tört", és nem azt végtelen tizedestört. Itt ugyanis minden esetben kettes számrendszerbeli alakokról beszélünk, és ott bizony az átváltásoknál gyakran előfordulnak furcsaságok.
Próbáld ki pl. PHP-ban, hogy mi a 35 - 34.99 kivonás eredménye. Súgok: nem 0.01 lesz.
A szakmai alázat azt jelenti, hogy elfogadod, hogy ezek kipróbált, ismert dolgok, és a legtöbb olyan esetben, amikor bugot vélsz felfedezni egy ilyen rendszerben, akkor valószínűleg te tévedsz. 15+ év alatt én mindössze két olyan helyzetbe futottam bele, amikor egy fordító hibásnak tűnő tárgykódot generált. Az első egy Pascal kód volt (de lehet, hogy ott valójában én hibáztam), a másik pedig egy C# kód (és lehet, hogy ott is csak nem ismertem valamit, és azért nem ment) Szóval kicsit hátrább az agarakkal.
Amm kérdező kicsit szerintem nézz utánna annak a 2 es számrendszernek és a 10 es számrendszer tört számainak bináris számrendszerben. És ajánlom azt is hogy nézz utánna hogy a számítógép processzora hogyan kezeli az osztásokat.
Az hogy a PHP 0 ad, szerinted hogy jött ki? Elárulom, kerekítés. Szval ugyan úgy "szarul" számolt csak épp "jó" ereményt látsz.
Kerekíteni pedig te is tudsz :)
"Az elsőre példa a prímszámok (kivéve 1, 2 és 5),"
Az 1 nem prímszám.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!