Diskuze: Nepřesné násobení vysokými čísly - špatně zvolené datové typy?
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


V čem máš čísla uložený? Ve floatu?
Desetinný čísla jsou uložený tak, že maj přesnost jen na několik
platných číslic - podle toho, jak velkej typ použiješ.
Float to má cca 7 platných číslic, pokud do něj uložíš i celý číslo větší než tuším 16 777 216, tak ti to už může vrátit jiný číslo, než jsi tam uložil, aniž bys s ním dělal nějaký výpočty.
na tohle by jeste mohl stacit double, kam az ty cisla muzou rust?
Operátor modulo % lze použít pro libovolný celočíselný typ.
2350000000 je mimo rozsah signed 32bit intu -> budto unsigned nebo 64bit int.
Pořád se tam můžeš potýkat se zaokrouhlovacími chybami, což je dáno tím, jak jsou interně desetinná čísla uložena v paměti (viz IEEE 754). Vzhledem k jejich reprezentaci třeba není možné přesně uložit čísla jako dvě desetiny – protože nejdou rozložit na konečný součet (byť i záporných) mocnin dvojky.
Pokud potřebuješ přesnost na relativně málo desetinných míst, můžeš desetinná čísla reprezentovat čísly celými. Pokud třeba potřebuješ být přesný na pět des. míst, prostě místo jednotek pracuj se statisíci (v zásadě vše vynásobíš 100000, abyses s des čísly vůbec nesetkal). Pokud ti bude stačit 64bitový integer, tak máš vyhráno.
Navíc, počítání s celými čísly je výrazně rychlejší než z desetinnými (pokud nevyužiješ paralelizační možnosti procesoru či grafické karty).
Int, long, unsigned, unsigned long jsou stále mimo rozsah. Proto při převodu z větší hodnoty která je mimo rozsah na menší dochází k nesmyslné hodnotě. Aby si mohl provést operaci modulo s velkou hodnotou, použij datový typ long long, nebo unsigned long long. Tyto typy jsou podporovány od verze C99. Pro výpis pomocí printf() long long použij specifikaci formátu %lli, pro unsigned long long použij specifikaci formátu %llu.
Např:
printf("%lli\n", ((long long)(a*b)) % x);
Díky za všechny odpovědi i věcné připomínky. Inu, nováček se sám vytrestal tím, že poznatky o syntaxi a datových typech céčka čerpal pouze z prvního českého zdroje, který mu strejda Google vyplivl - tak o půlce zde zmíněných typech jsem neměl ani páru.
Díky Lubošovi za okamžité a věcné odpovědi, díky DarkCoderovi za syntaxi, jako řešení ale nakonec označím Martina. Myslím, že jeho návrh výrazně zkrátil toto vlákno a šetří čas i nervy ostatních přispěvatelů, protože okamžitým převodem na celá čísla předejdu dalším problémům, které bych zde jinak konzultoval.
Zobrazeno 11 zpráv z 11.