Stránka 3 z 3

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

Napsal: 21 čer 2017 18:58
od faraon
  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 607 x

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

Dokážeš to nějak rozumně vysvětlit?

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

Napsal: 21 čer 2017 19:37
od cpp
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.

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

Napsal: 21 čer 2017 19:52
od Ltb
: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...

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

Napsal: 07 črc 2017 17:21
od faraon
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