Portál AbcLinuxu, 2. května 2025 08:44

Céčko a triviálna matematika

31.3.2008 23:28 | Přečteno: 1853×

Céčkom som sa nikdy nezaoberal a tým pádom viem o ňom naozaj len málo. No vážne som netušil, že nezvláda ani jednoduché porovnanie dvoch čísel!

Kamarát sa mi stažoval, že sa mu nedajú porovnať dve desatinné čísla v Céčku. Neveril som kým som si nenapísal vlastný kód:

priklad.c:
#include <stdio.h>

int main() {

	double Fg, Fy, g;
	int m;

	g=9.81;
	m=10;
	Fg=g*m;

	Fy=98.1;

	printf("Fg = %f\nFy = %f\n", Fg, Fy);

	if (Fg==Fy) {
		printf("OK\n");
	}
	else {
		printf("FUCK\n");
	}

	return 0;

}

Preložil som si ho pomocou gcc priklad.c a spustil - "./a.out". Samozrejme som bol prekvapený už len z toho, že sa mi to skompilovalo, keďže moje skúsenosti s Céčkom skončili pri Hello World.. :) Ale nanešťastie mi môj program zanadával, čo by sa nemalo stať, keďže tie dve premenné sa rovnajú!

Preto by som sa vás chcel spýtať, kde je chyba..? Ja ju teda naozaj nevidím.. :(

       

Hodnocení: 40 %

        špatnédobré        

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

Komentáře

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

Vložit další komentář

Jardík avatar 31.3.2008 23:40 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Nerovnají, protože se pravděpodobně provede (double)(((int)g)*m). Jestli chceš správný výsledek, musíš do napsat Fg=g*(double)m; nebo by muselo být m typu double.
Věřím v jednoho Boha.
Milan Lajtoš avatar 31.3.2008 23:44 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Zmenil som teda m na double a stále sa to nerovná.
“Every great achievement was once considered impossible.”
Josef Kufner avatar 31.3.2008 23:47 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
int krát double vrací double. Vždy se provede přetypování na ten "větší" datový typ.
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 31.3.2008 23:45 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Nemůžeš testovat rovnost dvou čísel s plovoucí desetinou čárkou. A to v žádném jazyce. Musíš udělat absolutní hodnotu jejich rozdílu a porovnat, zda je menší než požadovaná přesnost porovnání. Problém je totiž v tom, že samotná reprezentace takovýchto čísel je nepřesná.
if (fabs(Fg - Fy) < 0.01) {
Hello world ! Segmentation fault (core dumped)
Milan Lajtoš avatar 31.3.2008 23:56 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Áno, takto to už funguje ako má. Ďakujem. :)
“Every great achievement was once considered impossible.”
1.4.2008 08:10 filo | skóre: 22 | blog: FiloBlog | Ostrava
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Nemůžeš testovat rovnost dvou čísel s plovoucí desetinou čárkou. A to v žádném jazyce.
Přesně tak. Někdy není dobré věřit tomu, co člověk vidí, ať už v debuggeru, editoru nebo na výstupu. Stejný problém se mnou kdysi "zacvičil" v Delphi a Interbase/Firebirdu. Čísla vypadala, že mají 2 des. místa, ale v reálu tam byl ještě drobek v x-tém řádu.
31.3.2008 23:47 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Protože Vám chybí triviální základy ohledně teorie. Protože reálná čísla ve formátu floating point jsou jen přibližná a dochází k zaokrouhlovacím chybám při převodu mezi desítkovým (které máte ve zdrojáky) a dvojkovým vyjádřením reálného čísla v plovoucí čárce (jak je vnitřně uloženo).

Tohle ale patřilo mezi věci, které se v mé době člověk co začínal programovat učil jako první. Ale dnes se propaguje fakt sedni a dělej a pak jsou lidi překvapení naprosto běžnými věcmi.
http://ponkrac.net
Milan Lajtoš avatar 1.4.2008 00:01 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Aspoň sa môžem vyhovoriť, že nás to v škole neučili. :) Ale naozaj nechápem ako som mohol prísť k takejto zásadnej veci až teraz. Hold, asi si vystacim s celociselnymi typmi.. ;)
“Every great achievement was once considered impossible.”
1.4.2008 11:07 Kvakor
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Opravdu se to dnes neuci? To, ze se dnes uz neuci assembler, se mi sice nelibi, ale chapu to. To, ze se nevysvetluje, jak hardware vlastne pracuje, se mi take nelibi, ale i to dokazu pochopit. Ale to, ze se neuci, jak vypadaji cisla v pohyblive radove carce, povazuju za zlocin, protoze prave chyby, zpusobene neznalosti zakladnich datovych typu, mohou byt velmi zavazne (obzvlast treba v takovem bankovnictvi :-) ). A plati to i pro jazyky, ktere jsou jen slabe typove, nebo typy nepouzivaji vubec.

Minimalne by mel kazdy, kdo programuje, vedet, ze u cisel v plovouci radove carce existuje jen omezena presnost, pri scitani moc rozdilnych cisel mohou podtect, nelze je porovnavat klasickym zpusobem, ale pouze pomoci absolutni hodnoty rozdilu a nastavene presnosti, a ze pro operace nad temito cisly neplati za urcitych okolnosti asociativia a komutativnost, tj. ze nemusi platit napr. (a/b)*c=(a*c)/b.
1.4.2008 11:59 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Protože dnes se to považuje za zbytečné :-(

Jinak operace s reálnými čísly na počítači komutativní jsou, ale nejsou asociativní.
1.4.2008 15:20 Kvakor
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Jinak operace s reálnými čísly na počítači komutativní jsou, ale nejsou asociativní.
Za urcitych okonlosti nejsou ani komutativni - pokud se nepocita v plne presnoti, dochazi k chybam v dusledku konverze pri nacitani a ukladani dat z/do koprocesoru. Presneji je to popsano treba na Wikipedii, u popisu rozdilu klasickeho FPU a SSE2. Pak zalezi, jakym zpusobem je vzorec zpracovan a poradi promenych muze ovlivnit presnost vysledku.

Prakticky je ale pravdepodobnost neceho takoveho v bezne praxi velmi mala, ale je dobre to vedet.
1.4.2008 16:45 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Hlavně je dobré psát aplikace tak, aby jejich funkčnost na takových věcech nezávisela. Tedy aby se zaokrouhlovací chyby projevovaly pokud možno až v těch řádech, které nás nakonec stejně nezajímají.
1.4.2008 19:35 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Za urcitych okonlosti nejsou ani komutativni - pokud se nepocita v plne presnoti, dochazi k chybam v dusledku konverze pri nacitani a ukladani dat z/do koprocesoru.

Pak ale komutativnost základních operací není narušena. Protože mluvíme o základních operacích, tedy třeba o

a + b

ne o operaci

converze(a) + converze(b)

Pokud skládáte více operací, pak už platí ta věta o asociativnosti, ale přímé jednoduché operace jsou komutativní.

A pokud si data ukládáte ve více formátech a i na jednoduchou matematickou operaci uděláte konverze - tak pak je to nešikovnost programátora, děláte-li to častěji to za prvé a za druhé už to s konverzí není jedna jednoduchá matematická operace.
1.4.2008 19:41 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Jinak bych dodal, že SSE2 je kriplík. Pokoušel jsem se ho kdysi použít a počítá tak blbě a nestandardně, že zlaté FPU. Rychle jsem přišel na to, že ošetřit pro SSE2 všechny potřebné případy tak, aby to přes operace s xmm registry proběhlo v pořádku ve všech případech hodnot mi sežere víc výkonu, než to prostě narvat do FPU, která počítá korektně.

SSE2 je použitelné pro floaty jen tehdy, pokud máte určitá omezení na množinu hodnot, která tím prochází a zaručíte, že výpočet z určitého rozsahu nevybočí.

Argumentovat SSE2 jednotkou na reálná čísla mi přijde stejné jako vyrobit aritmetickou jednotku, která spočítá, že 1+2=8, a vše ostatní spočítá dobře a pak tím argumentovat, že výpočty na integer číslech nejsou komunitativní, protože přeci 1+2=8 a 2+1=3. Pokud máte kriplíka počítací jednotku, tak je chyba v té jednotce, ne v číslech.
1.4.2008 14:53 Martin Böhm | skóre: 17 | blog: Martinův stánek | Je mi to MFFUK
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Blbost. Učí se to každý, kdo se vůbec učí.
5 z 0 přetečení bufferu doporučuje Korespondenční seminář z programování (pro středoškoláky programátory).
Jardík avatar 1.4.2008 18:11 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Blbost. Potvrzuji, že jsme se tohle také neučili.
Věřím v jednoho Boha.
1.4.2008 18:20 Martin Böhm | skóre: 17 | blog: Martinův stánek | Je mi to MFFUK
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Já Tě varoval, že důkaz chybí :o)
5 z 0 přetečení bufferu doporučuje Korespondenční seminář z programování (pro středoškoláky programátory).
31.3.2008 23:48 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Rovnajú? Spíš nerovnajú, ne? Nebo v čem je vlastně problém? Každopádně vsadím krk na to, že program, operační systém, standardní knihovna a možná i hardware se chová naprosto korektně a problém je mezi židlí a klávesnicí :-)

Nicméně toto je celkem známý problém. Počítače počítají ve dvojkové soustavě a ne v desítkové. Když ti dám spočítat, kolik je deset děleno třema, nikdy mi v desítkové soustavě nenapíšeš přesný výsledek. Stejně tak těžké je pro počítač popsat jednu desetinu. Někde se prostě musí zaokrouhlit, tím vznikne chyba, a když tu chybu zdesetinásobíš, bude to už docela velká chyba, která způsobí nerovnost těch čísel. Řešením je tolerovat drobné chyby, použít zlomky, použít matematickou knihovnu s neomezenou přesností nebo tak něco :-)
31.3.2008 23:54 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Ad můj první odstavec: už jsem to pochopil, kedže znamená nejspíš protože. Zatracená slovenština :-) Never mind.
31.3.2008 23:52 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Preto by som sa vás chcel spýtať, kde je chyba..? Ja ju teda naozaj nevidím.. :(

To vidis spravne! Ziadna tam nie je, je to uplne spravne.
If you hold a Unix shell up to your ear, you can you hear the C.
Vašek Lorenc avatar 31.3.2008 23:52 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
A schválně.. jak dlouho bych musel dělit, aby se výsledek operace 4/3 rovnal po vynásobení 3 zase zpátky třem? Při tom, jak se desetinná čísla reprezentují v počítači, může být takové 0.1 poněkud nešťastné číslo..
...včetně majestátného loosa
31.3.2008 23:57 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Aby 4 děleno 3 krát 3 bylo opět tři? Na čem jedeš, na Pentiu? :-D
Vašek Lorenc avatar 31.3.2008 23:59 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Skoro ;) Dnešek byl delší, než bych si normálně přál. Inu, ale otázka platí, ne? ;) Dobře, omlouvám se.. výsledek měl být roven 4.
...včetně majestátného loosa
3.4.2008 09:43 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Z Poznáte matfyzáka:
V Moskovskom gosudarstvennom universitětě postrojili trojíčnuju sčotnuju mašínu Saturn.
Některé nástroje jsou na některé úlohy vhodnější než jiné. (typo 3=4 nechme stranou)
31.3.2008 23:54 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Právě z těchto důvodů existují i reálné číslo s pevnou desetinnou čárkou, která počítají přesně - ale Céčko je přímo nepodporuje. Ono to není totiž ani moc potřeba, protože prostě reálná čísla mají své vlastnosti, kde to nevadí. Ono spoustu příkladů stejně nevypočítáte přesně: Kolik je přesně pí? Kolik je přesně e?

A jako další pokud navrhuji spočítat kolik je nula děleno nulou - to totiž v reálných číslech jde. A kolik je třeba jedna děleno nulou - vyjde nekonečno a printf Vám to vypíše. Pak můžete zarýt do ohlašovaného a neohlašovaného NaN, pohrát si s reálnými čísly v normalizovaném a denormalizovaném tvaru. To všechno Vaše Céčko umí :-)

A pak třeba si zapnout FPU výjimky a hrát si s nimi a chytat je, nastavit si přesnost v FPU jednotce, způsob zaokrouhlování.

A nebo porovnávat reálná čísla jako integery - to jde, protože formát reálných čísel podle IEEE 754 normy to umožňuje - a dá to správný výsledek.

Zkrátka reálná čísla jsou pro většinu lidí pole neprobádané, kde je tolik skrytých věcí pro většinu populace až to hezké není.
http://ponkrac.net
1.4.2008 01:23 h3poun
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Opravdu čísla s pevnou desetinnou čárkou počítají přesně? Není hlavní rozdíl vůči pohyblivé čárce, že vlastně mají pouze mantisu, takže z hlediska přesnosti jsou spíše v nevýhodě a jejich smysl spočívá spíše někde jinde (např. úspora paměti)? Ale třeba se mýlím...
1.4.2008 01:33 h3poun
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Tedy abych se ještě opravil, pevná čárka má při stejné paměťové náročnosti vyšší přesnost, ale pořád konečnou a to je podle mne jádro pudla. Pohyblivá čárka má zase větší rozsah [nejmenší vyjádřitelné číslo..největší]. Jde o to, co je pro nás v dané situaci výhodnější.
1.4.2008 01:50 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Pro operace plus, mínus, krát počítají čísla s pevnou řádovou čárkou přesně bez zaokrouhlovacích problémů - a to je to co autor počítá. A pokud dáte vypočítat jeho příklad, ale namísto double by tam byl typ s pevnou řádovou čárkou, tak se mu jeho příklad bude rovnat - nebude se divit.

Je jasné, že zase ne všechna existující matematická reálná čísla lze vůbec v počítači reprezentovat - ale tady je zase úplně jedno, jestli jde o pevnou, nebo plovoucí řádovou čárku, nebo třeba logaritmickou, či jinou reprezentaci v počítači, to platí pro všechno. Neexistuje možnost mít na počítači taková čísla, aby vyjádřila celý matematický pojem reálného čísla. Nejde to.

Pohyblivá řádová čárka nemusí mít nutně větší rozsah, než pevná. Pokud třeba zvolíte typ, který bude reprezentovat deset tisíc číslic v pevné řádové čárce, pak číslo typu double jste překonal i v rozsahu. Pevná řádová čárka nemusí mít vyšší přesnost, než pohyblivá. Ono je to tak - pevná řádová čárka fixuje a dělá konstantní počet míst za desetinnou čárkou - a to je její doména. Pohyblivá řádová čárka zase fixuje počet platných číslic, které jsou pro daný typ konstatní. A podle toho co potřebujete se rozhodnete. Ale většinou jsou užitečnější ty pohyblivé.

Existující i jiné reprezentace - třeba jako zlomek (dvě integer čísla), nebo logaritmické (ukládáte logaritmus čísla - velmi výhodné a super rychlé pro algoritmy s obrovskou spoustou násobení a dělení - zrychlení výpočtu je pak enormní).

Vůbec numerická matematika je zajímavá, ale složitá věda.
1.4.2008 10:36 h3poun
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Při stejné paměťové náročnosti by mělo mít číslo s pevnou desetinnou čárkou menší rozsah než číslo s pohyblivou, to bylo, co jsem psal. Autorův problém spočívá v tom, že v kódu používá čísla zadaná v desítkové soustavě, která při klasické reprezentaci ve dvojkové soustavě nemají ukončený rozvoj, v čemž by mu zřejmě nepomohla ani pevná desetinná čárka. Ale nechci se hádat, protože si, myslím, rozumíme.
1.4.2008 11:54 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Rozumíme si a naprosto souhlasím.
1.4.2008 11:47 Kvakor
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Je jasné, že zase ne všechna existující matematická reálná čísla lze vůbec v počítači reprezentovat - ale tady je zase úplně jedno, jestli jde o pevnou, nebo plovoucí řádovou čárku, nebo třeba logaritmickou, či jinou reprezentaci v počítači, to platí pro všechno. Neexistuje možnost mít na počítači taková čísla, aby vyjádřila celý matematický pojem reálného čísla. Nejde to.
Presneji receno, mnozina reprezentovatelnych cisel v pocitaci ma vzdy mohutnost (kardinalitu) pouze mnoziny celych cisel (napr. kazde cislo muzete pretypovat ci prevest na nejaky celociselny typ), ktera je nekonecna (v pocitaci jen teoreticky), ale spocetna (kazdemu prvku muzete priradit pritozene cislo, treba diagonalizaci). Ale mnozina realnych cisel ma vyssi mohutnost, protoze je nejen nekonecna, ale i nespocetna, tj. mezi kazda dve cela nebo racionalni cisla muzete umistit nekonecne mnoho cisel iracionalnich.

Zjednodusene receno: mnozina cisel reprezentovatelnych na pocitaci je sice (teoreticky) nekonecna, ale je nekonecnekrat mensi nez mnozina realnych cisel. Ale moc nad tim nedumejte, nebo se z toho zblaznite jako chudak Cantor.

Prakticky se pomoci plovouci radove carky daji presne reprezentovat jen cela cisla do velikosti mantisy a jejich nasobky vynasobene 2 na rosah exponentu. Cokoliv jineho uz muze byt nepresne. U necelych cisel jsou presna jen ta, ktera jdou prevest na racionalni cislo, jehoz delitel je mocnina dvou. Cokoliv jineho dava nekonecny binarni rozvoj a je tudiz nepresne.

Pokud budete pouzivat bignums, kde jsou cisla reprezenovana racionalnimy cisly (delenec/delitel), tak muzete presne reprezentovat tak velka racionalni cisla, na ktera vam staci pamet. Ale jakekoliv iracionalni cislo (Pi, e, odmocniny atd.) je mozne reprezentovat jen a pouze jako aproximaci s konecou presnosti.
1.4.2008 11:58 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Prostě reálná čísla jsou na počítači jen zakuklené integery :-)

Jinak souhlas.
1.4.2008 11:59 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Nejen reálná čísla… :-)
michich avatar 1.4.2008 12:24 michich | skóre: 51 | blog: ohrivane_parky
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Ale mnozina realnych cisel ma vyssi mohutnost, protoze je nejen nekonecna, ale i nespocetna, tj. mezi kazda dve cela nebo racionalni cisla muzete umistit nekonecne mnoho cisel iracionalnich.
Mezi libovolnými dvěma racionálními čísly najdete taky nekonečně mnoho racionálních čísel. To ale neznamená, že by množina racionálních čísel byla nespočetná. (Ne)spočetnost je definována podle (ne)existence bijekce na množinu přirozených čísel.
1.4.2008 13:32 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Aspoň mezi množináři. Slušné obory považují konečné množiny také za spočetné… :-)
1.4.2008 16:19 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
resneji receno, mnozina reprezentovatelnych cisel v pocitaci ma vzdy mohutnost (kardinalitu) pouze mnoziny celych cisel (napr. kazde cislo muzete pretypovat ci prevest na nejaky celociselny typ), ktera je nekonecna (v pocitaci jen teoreticky), ale spocetna (kazdemu prvku muzete priradit pritozene cislo, treba diagonalizaci). Ale mnozina realnych cisel ma vyssi mohutnost, protoze je nejen nekonecna, ale i nespocetna
Coz je sice pravda, ale je to v tomto kontextu irelevantni. Lowenheim-skolemova veta nam totiz zarucuje, ze existuje spocetna podmnozina realnych cisel, ktera obsahuje vsechna 'zajimava' realna cisla. A tedy staci reprezentovat tuto spocetnou podmnozinu. Nicmene algoritmy pracujici nad takovou podmnozinou stejne nejspis nedobehnou v rozumnem case ...
1.4.2008 16:58 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Mám tomu rozumět tak, že celá analýza je nezajímavá?! :-)
1.4.2008 17:17 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Nikoliv. Celou analyzu je mozne formulovat v ramci teorie mnozin a pokud je teorie mnozin bezesporna, tak na zaklade LS vety ma spocetny model. Tedy i analyzu jde delat v ramci te spocetne podmnoziny realnych cisel. Jde to definovat i pripocare, bez okliky pres teorii mnozin, akorat je treba lehce preformulovat analyznicke axiomy a vety.
1.4.2008 17:33 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
No, moc se mi to nezdá, ale momentálně je můj spánkový deficit příliš velký na to, abych v té úvaze hledal chybu nebo abych si představoval, jak namodelovat nespočetné množiny ve spočetném modelu.
1.4.2008 14:52 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
A jako další pokud navrhuji spočítat kolik je nula děleno nulou - to totiž v reálných číslech jde.
Zdroj by nebyl?
1.4.2008 15:13 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Norma IEEE 754, a normy jazyků C/C++ :-)
1.4.2008 15:25 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Jesus! Já myslím reálná čísla jako reálná čísla a ne jako Binary Floating-Point aritmetiku.
1.4.2008 16:09 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Tak to jsem špatně pochopil! Ale pokud máte limity, tak jde leccos i v matematice :-) Tedy někdy.

Ale jinak jak vidíte, počítače zvládají bravurně věci, se kterými má matematika problémy :-)
1.4.2008 16:12 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
:-) Spíš já špatně pochopil tvůj komentář. :-) Ale to už je fuk. Hlavně, že jsme si to vyjasnili :)
31.3.2008 23:55 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
"keďže tie dve premenné sa rovnajú!"
Opravdu? Doporučil bych změnit ten printf na tenhle:
printf("Fg = %f\nFy = %f\n, Fg - Fy = %0.30f\n", Fg, Fy, Fg - Fy);
Pak doporučuji zamyslet se nad tím, jak v dvojkové soustavě (potažmo v plovoucí řádové čárce) vypadá třeba číslo 0.01 (9.81 je 981 * 0.01).

Povinná četba pro Tebe. ;-)
Jak moc jsou ábíčkáři inteligentní? ;-)
Milan Lajtoš avatar 1.4.2008 00:14 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Ak mám pravdu povedať, tak ma naozaj nikdy nezaujímalo, že ako sú uložené, no myslím, že po tejto skúsenosti mám na to naozaj dobrý dôvod. Samozrejme si to teda prečítam. :)
“Every great achievement was once considered impossible.”
zoul avatar 1.4.2008 15:04 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
A není na to nějaký warning?
1.4.2008 15:23 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Jenže ono porovnávání na reálných číslech na rovnost není vždy špatně. Třeba tohel projde vždy správně:
double a = 0.0;
double b = 2.0 - 2.0;

if (a == b)
  printf("Jsi nula!");
Není tam sebemenší důvod, proč by tam bylo cokoli špatně, žádná zaokrouhlovací ani jiná chyba aproximace se v tomto případě vůbec neobjeví. Zde je porovnávání reálných čísel naprosto v pořádku.

Nebo další:
bool is_nan(double x)
{
  return (x != x);
}

Také je porovnávání naprosto v pořádku, není problém.

Prostě pak se tyhle věci musí řešit tak, že se do zdrojáku napíše:
#ifdef __GNUC__
  vypni_debilni_nedomysleny_gcc_warning
#elif _MSVC_VER
  vypni_debilni_nedomyslene_ms_warningy
#endif
Nejlépe do globálního headeru připojeného všemi moduly.
31.3.2008 23:57 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
A vyšší level: Pro jaké reálné číslo platí toto:
double x = ?;

if (x != x)
  printf("Nerovnaji se");
http://ponkrac.net
1.4.2008 00:10 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Není to chyták? To je přeci totéž, co isnan(x) a "not a number" již z definice není zrovna "číslo". :-)
1.4.2008 00:41 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
No ale uložíte ho do typu na reálné číslo :-) A Céčko s ním jako s reálným číslem pracuje. :-) Ona totiž definice "počítačově uložené floating point číslo" a "matematická definice čísla" není totéž. A nan splňuje první definici, a nesplňuje druhou.
1.4.2008 00:45 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Ale Vy jste znalý člověk, tak pro Vás, pane Kyosuke mám ještě jeden vyšší level (a ostatní také mohou odpovídat :-) ):

Pro které číslo (zdůrazňuji jde mi o počítačovou definici čísla) platí, že v proměnné a i b budou (trochu) jiná čísla?
double vrat_cislo(double x)
{
  return x;
}

double a = ?;
double b = vrat_cislo(x);
1.4.2008 00:46 Miloslav Ponkrác | blog: miloslavponkrac
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Pardon, ve zdrojáku jsem se přeťukl, ale na principu to nic nemění:
double vrat_cislo(double x)
{
  return x;
}

double a = ?;
double b = vrat_cislo(a);
xxx avatar 1.4.2008 10:10 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
double a = c++; :-)
Please rise for the Futurama theme song.
xxx avatar 1.4.2008 10:11 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Hups jsem se spatne podival :-(
Please rise for the Futurama theme song.
1.4.2008 12:58 anicka | blog: ze_zivota
Rozbalit Rozbalit vše Re: Céčko a triviálna matematika
Odpovědět | Sbalit | Link | Blokovat | Admin
Kde je chyba? Prece v architekture Tve masiny :-)

Ovsem nerikala bych tomu chyba, ale vlastnost.
^D

Založit nové vláknoNahoru

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