abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 05:55 | Komunita

Ubuntu 19.04 bude mít kódové jméno Disco Dingo. Dle oznámení v diskusním listu ubuntu-devel-announce je ve vývojové verzi Disco Dinga výchozím Pythonem 3 verze 3.7. Perl byl aktualizován na verzi 5.28. OpenSSL 1.0 bude nahrazeno OpenSSL 1.1.1 LTS. Nové instalace Dinga budou mít sloučený /usr. Stane se tak 7 let po sloučení /usr ve Fedoře nebo Arch Linuxu.

Ladislav Hagara | Komentářů: 0
dnes 02:22 | IT novinky

V pondělí a úterý proběhl v San Franciscu Chrome Dev Summit 2018. Přehled dění v příspěvcích na Chromium Blogu. Videozáznamy přednášek na YouTube. Představen byl například web pro webové vývojáře web.dev nebo rozšíření webového prohlížeče Chrome s názvem VisBug (YouTube) určené pro webdesignery. Slíbená je podpora Firefoxu.

Ladislav Hagara | Komentářů: 0
včera 23:22 | Zajímavý projekt

Byl spuštěn Humble Dystopian Bundle. V balíčku počítačových her jsou také hry běžící na Linuxu: Beholder, Orwell: Keeping an Eye On You, Orwell: Ignorance is Strength a Observer.

Ladislav Hagara | Komentářů: 0
včera 22:44 | Zajímavý článek

Jan Klat publikoval na Medium výsledky ankety věnované platům PHP vývojářů. Zúčastnilo se 419 respondentů. Kompletní výsledky na Tabulky Google.

Ladislav Hagara | Komentářů: 1
včera 22:22 | Nová verze

Byla vydána nová verze 1.29 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Představení novinek také na YouTube.

Ladislav Hagara | Komentářů: 0
včera 11:47 | Pozvánky
Začínáte s automatizací? Chcete se naučit správně používat Ansible? Přijďte na další Prague Containers Meetup 20. listopadu v prostorách Seznamu v Praze na Andělu.
little-drunk-jesus | Komentářů: 0
včera 11:47 | Pozvánky
V úterý 20. 11. v Praze proběhne akce Oracle Czech Republic Meetup Group. Od 18.00 si budete moct vyslechnout přednášky NetSuite Developer Toolset a Product Recommendations system at Bronto.
RichardF | Komentářů: 0
včera 10:33 | Nová verze

Byly aktualizovány živé instalační obrazy průběžně aktualizované linuxové distribuce Void Linux (Wikipedie). Nejnovější obrazy ve verzi 20181111 jsou k dispozici vedle i686 a x86_64 také pro jednodeskové počítače s ARM: BeagleBone, Cubieboard, Odroid a Raspberry Pi. Void Linux používá balíčkovací systém XBPS (X Binary Package System), LibreSSL a init systém a správce služeb runit. Ke stažení jsou obrazy postavené jak nad glibc, tak nad musl.

Ladislav Hagara | Komentářů: 3
včera 02:00 | IT novinky

Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem zůstává superpočítač Summit. Český superpočítač Salomon klesl na 213. místo. Další přehledy a statistiky na stránkách projektu. V aktuálním žebříčku GREEN500 (GFlops/watts) obsadil superpočítač Summit 3. místo.

Ladislav Hagara | Komentářů: 0
12.11. 22:55 | Zajímavý projekt

Sir Tim Berners-Lee koncem září představil myšlenku projektu Solid. Jedná se o reakci na jednak jednostranné využívání webu k neinteraktivnímu publikování dokumentů, ale také centralizaci služeb, v jejichž případě uživatelé předávají svá data několika málo centrálním entitám. Článek na webu LWN.net Solid ukazuje konkrétněji. Základním konceptem je „pod“, uzel (lokální nebo v cloudu), kde by uživatelé mohli ukládat své komentáře k obsahu třetích stran.

Fluttershy, yay! | Komentářů: 0
Jak nejčastěji otevíráte dokumenty na počítači?
 (89%)
 (3%)
 (8%)
Celkem 62 hlasů
 Komentářů: 4, poslední včera 14:36
Rozcestník

Dotaz: Rovnost v céčku

4.11. 20:54 Kacka99
Rovnost v céčku
Přečteno: 723×
Zdravím, potřebovala bych pomoci s rovností.

long double a, b, c, x, y, z;

scanf("%Lf%Lf%Lf%Lf%Lf%Lf", &a, &b, &c, &x, &y, &z);

long double o1, o2;

o1 = a + b + c;

o2 = x + y + z;

if (o1 == o2) printf("obvody jsou stejné");

if (o1 < o2) printf("obvod dva je větší");

no a když zadávám desetinná čísla, tak i když jsou stejné obvody, tak mi to vyhazuje, že obvod dva je větší. U celých čísel to funguje. Prosím tedy o radu, co dělám špatně?

Řešení dotazu:


Odpovědi

4.11. 21:11 Kit | skóre: 42 | Brno
Rozbalit Rozbalit vše Re: Rovnost v céčku
Čísla typu float a double se nedají přímo porovnávat na rovnost. Je nutné zpracovat i přesnost porovnání (eps).
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Blaazen avatar 4.11. 21:16 Blaazen | skóre: 22
Rozbalit Rozbalit vše Re: Rovnost v céčku
Protože double nedokáže přesně uložit některé hodnoty, např. místo 4,5 uloží 4,49999999 a někdy to nevyjde.
4.11. 21:32 Kacka99
Rozbalit Rozbalit vše Re: Rovnost v céčku
Děkuji moc. A prosím jak to mám tedy udělat?
vencour avatar 4.11. 21:50 vencour | skóre: 55 | blog: Tady je Vencourovo | Praha+západní Čechy
Rozbalit Rozbalit vše Re: Rovnost v céčku
Testujte rozdíl obou čísel, že je menší třeba než 10E-5.
Ty nejhlubší objevy nečekají nutně za příští hvězdou. Jsou uvnitř nás utkány do vláken, která nás spojují, nás všechny.
4.11. 22:23 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Rovnost v céčku

Pro jistotu: …že je jeho absolutní hodnota menší…

Ad "třeba než 10E-5": (1) 10E-5 se obvykle píše spíš jako 1E-4 (což je docela dost). (2) U skutečných úloh je odhadování chyb mnohem komplikovanější než že podívám z okna a plácnu od oka nějaké číslo. Tady ale zadání vypadá tak uměle, že to až smrdí domácím úkolem, takže je to asi jedno.

Jendа avatar 5.11. 03:14 Jendа | skóre: 75 | blog: Výlevníček | JO70FB
Rozbalit Rozbalit vše Re: Rovnost v céčku
Neměl by ten limit být nějaký zlomek z magnitudy toho čísla? Pro porovnávání 1e-10 a 2e-10 je limit 1e-4 moc, pro porovnávání 1e+20 a 1.1e+20 je málo.
Bojíte se, že když umřete, nebudete nikomu chybět? Pište kód bez komentářů a dělejte nedokumentované změny!
5.11. 05:27 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Rovnost v céčku
To by v praxi znamenalo, že třeba porovnání "a + b == c" a "a == c - b" může dát výrazně odlišné výsledky. Pokud bych to chtěl dělat opravdu pořádně, spíš bych se snažil spočítat horní odhad zaokrouhlovací chyby a použít ten.
4.11. 22:24 Luboš
Rozbalit Rozbalit vše Re: Rovnost v céčku
Před porovnání double (nebo float) je třeba rozhodnout, s jakou přesností budou čísla porovnávána.
Řešeno je to např.zde:
Comparing floating point numbers
The following definitions are from The art of computer programming by Knuth:

bool approximatelyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyGreaterThan(float a, float b, float epsilon)
{
return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyLessThan(float a, float b, float epsilon)
{
return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
5.11. 01:04 MadCatX | skóre: 19 | blog: dev_urandom
Rozbalit Rozbalit vše Re: Rovnost v céčku
Kdyby to z toho kódu nebylo zřejmé, je důležité hodnotu epsilon škálovat podle toho, jak velká čísla se porovnávají (resp. porovnávané hodnoty normovat). Ten kód samotný je mimochodem trochu hybrid, v klasickém C není bool, v C++ by se zase mělo použít std::abs() místo fabs().
10.11. 18:25 luky
Rozbalit Rozbalit vše Re: Rovnost v céčku
C99 neni ani po temer dvaceti letech klasicke C? A jake je tedy to klasicke - C89, K&R...?

Hlavicka stdbool.h musi definovat bool jako _Bool. _Bool je interni typ stene jako treba int.
10.11. 19:52 rastos | skóre: 61 | blog: rastos
Rozbalit Rozbalit vše Re: Rovnost v céčku
Visual Studio pridalo _Bool s verziu 2013. Čo je púhych 5 rokov dozadu. A poznám ľudí, ktorí sa ešte nepohli za C98 ... všetko novšie považujú za nepotrebné "panské huncútstvo" a chvíľkový ošiaľ, ktorému sa neoplatí venovať čas ... do čerta, musím si ísť zapiť depku ... :-(
10.11. 22:42 debian+
Rozbalit Rozbalit vše Re: Rovnost v céčku
Co z C98? Hm, dvojriadkove komentare, snprintf(), UTF16 (ktoru som nikdy v zivote nevyuzil). Strnlen bola pridana neskor. A mozno nejake fun.

Kto ma rad C, bool zrejme az tak nefandi.
10.11. 21:39 MadCatX | skóre: 19 | blog: dev_urandom
Rozbalit Rozbalit vše Re: Rovnost v céčku
Uvedený snippet neříká, že by se mělo includovat stdbool.h a protože jde zřejmě o začátečnický dotaz, přišlo mi vhodné na to upozornit. Co se podpory C99 týče, třeba MSVC úplnou podporu standardního C99 pořád nemá.
5.11. 06:19 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Rovnost v céčku
To by např. znamenalo, žeessentiallyEqual(a, 0, epsilon) bude totéž co "a == 0" a pro epsilon < 1 i approximatelyEqual(a, 0, epsilon).
5.11. 10:25 MadCatX | skóre: 19 | blog: dev_urandom
Rozbalit Rozbalit vše Re: Rovnost v céčku
Což může být žádoucí, protože "skoro nula" a "úplně nula" je v některých případech zásadní rozdíl. V opačném případě je třeba porovnání vůči nule ošetřit zvlášť.
5.11. 11:23 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Rovnost v céčku
Ten problém se netýká jen nuly, na té je to jen názornější. Chyba je v samotném předpokladu, že velikost zaokrouhlovací chyby poznám z čísla samotného a nepotřebuji vědět, jak jsem k němu došel. Pokud bych chtěl jít touhle cestou, musel bych si u každé číselné hodnoty udržovat i informaci o její (ne)přesnosti a tu dopočítávat i při každé aritmetické operaci.
5.11. 10:37 sad
Rozbalit Rozbalit vše Re: Rovnost v céčku
Já bych zkusil desetinná čísla převést na řetězce pomocí funkce sprintf, sprintf je podobná funkce jako printf, s tím zásadním rozdílem, že proměnné nevypisuje na monitor, ale zapisuje je do řetězce.

Zde je její tvar. Jak vidíš, tak prvním argumentem, je řetezec, do kterého budeš zapisovat ono číslo. Formátovací řetězec bys mohla mít třeba pro dvě desetinná místa, takže "%.2Lf", a poté jen řetězce porovnáš funkcí strcmp.
5.11. 15:36 Tomáš
Rozbalit Rozbalit vše Re: Rovnost v céčku

Z https://bitbashing.io/comparing-floats.html

bool relativelyEqual(float a, float b,
    float maxRelativeDiff = FLT_EPSILON)
{
    const float difference = fabs(a - b);

    // Scale to the largest value.
    a = fabs(a);
    b = fabs(b);
    const float scaledEpsilon =
        maxRelativeDiff * max(a, b);

    return difference <= scaledEpsilon;
}
Řešení 1× (vencour)
včera 21:15 Kacka99
Rozbalit Rozbalit vše Re: Rovnost v céčku
Ahoj, všem moc díky. Porovnala jsem to s epsilon a šlo to. :)

Založit nové vláknoNahoru

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

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.