Programátorský víceboj 1. díl - Máme rádi matematiku

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 1. díl - Máme rádi matematiku

Příspěvekod faraon » 21 čer 2017 18:58

  1. Pfff... Já znám tohle: http://www.visual6502.org/JSSim/index.html Tak ještě jednou. Navrhni vlastní procesor s vlastní instrukční sadou, vytvoř jeho kompletní zapojení z logických hradel, a pak pochopíš to moje parsování parametrů.
  2. Změna stavu parametru je side effect. Ideálně by všechny měly být const ;-)
  3. Program je seznam deklarací. Nezávisle na jazyku.
  4. Oddělený překlad izoluje moduly od sebe, chceš-li mezi nimi něco sdílet, máš headery. Linkerů znám víc, třeba s fortranským jsem si pohrál moc hezky. A s příkazem COMMON...
  5. Je několik přístupů k tomu, jak něco spočítat úplně blbě. Nakresli si graf.
  6. Stejně jako předchozí bod, protože když srab, vydávající se z matematika, má bobky z nekonečna, tak prostě řekne že něco nejde. Nulou se dá dělit stejně jako spočítat druhou odmocninu záporného čísla!
Ohledně různosti kompilátorů a také zmíněných dialektů BASICu, člověk nikdy nemůže očekávat že počítač bude pracovat tak jak očekává:
ms_gwbasic.png
ms_gwbasic.png (2.91 KiB) Zobrazeno 596 x

zx_spectrum.png
zx_spectrum.png (1.27 KiB) Zobrazeno 596 x

Dokážeš to nějak rozumně vysvětlit?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Reklama
cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 1. díl - Máme rádi matematiku

Příspěvekod cpp » 21 čer 2017 19:37

1. Nemusím navrhovat vlastní procesor, abych pochopil tvé parsování. Nic světoborného to není a zároveň se to ani nehcová tak, jak by mělo.
2. A tohle moudro ti nakecal kdo?
3. Jestli neumíš rozlišovat mezi pojmy deklarativní a procedurální jazyk, tak se nemáme o čem bavit.
4. Bavíme se o C, nemotej sem Fortran. A oddělený překlad ti nepomůže.
5. Zase mimo.
6. A zase mimo. A jenom tak mimochodem, odmocnina ze záporného čísla lze spočítat jen za určitých podmínek.

Proto jsem chtěl, aby ITCrowd řekl podrobnosti, jelikož jsem měl podezření, že lže.

Uživatelský avatar
Ltb
Administrátor
Master Level 8.5
Master Level 8.5
Příspěvky: 6755
Registrován: únor 03
Bydliště: Praha západ
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Programátorský víceboj 1. díl - Máme rádi matematiku

Příspěvekod Ltb » 21 čer 2017 19:52

:oha:
Bylo by určitě strašně fajn udržet diskuzi na snesitelné úrovni, není potřeba se nijak slovně napadat ani o sebe "otírat" či dohadovat se, ten kdo to bude číst, o nic takového nestojí, věřte mi...prosím tedy bez dalšího braní se za slovo a slovíčkaření...jinak budeme muset zasáhnout a jediné, co tím utrpí, bude volná diskuze...

cpp: svými přístupy přes VPN síť a lehce hádavým stylem působíš velmi nedůvěryhodně :| nehledě na to, že mi připomínáš jiného, podobně do fóra přicházejícího uživatele, který již schvalování příspěvků měl nastaveno...

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Programátorský víceboj 1. díl - Máme rádi matematiku

Příspěvekod faraon » 07 črc 2017 17:21

cpp píše:Dobrý programátor musí umět používat knihovny.

A někteří je dokonce umí napsat :-D

Tak ještě pořád čekám na to vzorové řešení, doufám že se ho dočkám. Tohle je moje řešení, odkazující na onu xenofobní nulu z předchozí diskuze.

Tedy pro začátek druhá odmocnina, začneme od toho nejjednoduššího co se dá spočítat:

Kód: Vybrat vše

/* Funkce my_sqrt počítá druhou odmocninu z reálného čísla zadaného parametrem x. Funkce vrací reálné číslo. */

float my_sqrt(float x, int *err)
      {
      return *err=(x=(e2f(l2f(x)/2)),x==x&&Inf!=x&&-Inf!=x)?0:1,x;
      }


Libovolná celočíselná mocnina, tady to už trochu komplikuje znaménko mocnitele:

Kód: Vybrat vše

/* Funkce my_pow počítá n-tou mocninu (zadanou parametrem n, n je celé číslo) reálného čísla zadaného parametrem x. Funkce vrací reálné číslo. */

float my_pow(float x, const int n, int *err)
      {
      if (x>=0) x=e2f(l2f(x)*n);
      else x=((n%2)?-1:1)*e2f(l2f(-x)*n);

      *err=(x==x&&Inf!=x&&-Inf!=x)?0:1;

      return x;
      }


Libovolná celočíselná odmocnina, bonusový "static" v parametru funkce, což mě i můj překladač dost pobavilo:

Kód: Vybrat vše

/* Funkce my_nth_root počítá n-tou odocninu (zadanou parametrem n, n je celé číslo) reálného čísla zadaného parametrem x. Funkce vrací reálné číslo. */

float my_nth_root(float x, /*static*/ int n, int *err)
      {
      if (x>=0) x=e2f(l2f(x)/n);
      else x=-e2f(l2f(-x)/n);

      *err=(x==x&&Inf!=x&&-Inf!=x)?0:1;

      return x;
      }


Pár poznámek:

  • Typ float má tak mizernou přesnost, že se hodí leda k počítání domácích úkolů na základní škole. A někdy dvaatřicet bitů ani na to nestačí! Takže maximální přípustnou chybu jsem zcela ignoroval. Pro srovnání, osmibitový ZX BASIC na Sinclairu počítal se čtyřicetibitovými čísly, šestnáctibitový Turbo Pascal od Borlandu s osmačtyřicetibitovými, což přesností oboje postačuje i na vědecké výpočty, s výjimkou astronomických. Jazyk Cobol, určený pro finanční výpočty, dokonce kvůli přesnosti počítá desítkově. Zato float se musí při výpisu vždy zaokrouhlit, aby vyšlo aspoň něco.
  • Je nesmysl programovat matematickou knihovnu nebo funkce v ní obsažené, protože to už provedli jiní, trvalo jim to desítky let a udělali to mnohem lépe než bych dokázal já. Také nebudu tvořit další bc nebo dc, ze stejného důvodu jako v předchozí větě. Proto jsem zvolil (pro mne a podle mne) nejjednodušší metodu. Není ideální, není nejrychlejší, není moc přesná, je prostě pro daný účel "good enough" a také funkční.
  • Je nesmysl programovat matematickou knihovnu, ale naopak je velmi vhodné vědět jak funguje, a umět něco aspoň vzdáleně podobného udělat sám. Jinak to dopadne tak jak ukazují "moderní trendy", že kódovací opice googlí metodu na porovnání dvou čísel, a tu pak vlepí do svých bastlů, vyžadujících čtyři jádra a osm giga RAM na věc, která se dá udělat třemi instrukcemi. A že by chápaly a uměly napsat aspoň bubblesort nepřipadá v úvahu, to je pro ně sprosté slovo.
  • Moje řešení nezná chybné vstupní hodnoty, pouze chybné výsledky, takže chybu hlásí jen v případě že vyšlo Nekonečno nebo Nečíslo. A protože nehodlám implementovat kompletní IEEE 754, dokáží ty funkce spočítat i věci, které podle normy spočítat nejdou. Je-li to problém, musí ho ošetřit programátor který je ve svém programu použije, což se u knihoven třetích stran stává dost běžně.

► Zobrazit spoiler
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů