Kohta "Se" on valmis!

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Ai mikä on valmis?
No, hulppealla 8192 kpl:eella 29 bittisiä lukuja laskeva C++ ohjelmani!
Yhteen ja vähennyslasku on jo täysin valmis, ja kerto- ja jakolasku viimmeistelyä vaille valmis!
Lisäksi ohjelma tekee lukujärjestelmämuunnoksia mille tahansa kantaluvulle!

Miten se on mahdollista? Eikö bitti, oktaali, desimaali ja heksadesimaali olekaan ainuita?
EI! Kolmikantainen eli trimaalijärjestelmää olen jo kokeillut! Samoin muutamia muita parittomia lukujärjestelmiä. Esimerksiksi puolonen 1/2 on hassu kolmikantaisilla: 0,11111... loputon lukujono... (Riipuen tietysti mitä merkkejä käyttää lukuina)

Ai mitenkö? No, sillä tutulla muunnoskaavalla, eli jakamalla vaikkapa binääriluku halutun lukujärjestelmän kantaluvulla ja ottamalla jakojäännös luvun ensimmäiseksi desimaaliksi! Näin siis jatketaan, kunnes suurin merkitsevä lukema pilkun vasemmalla puolella on käyty läpi!
Entäpä murtolukuosa? Eikö siinä ole jokin "hukkapätkä" (lempinimeni Pitkässäniemessä), kun yritetään muuttaa esim. 3^20=3486784401 kertoimella 32-biitisen Inttinä tallennettua binäärilukua desimaaliseksi! EI! Luku tulee aivan samalla tavalla tuon kertolaskun jälkeen! Tulee 0/3 ja 1/3 ja 2/3, kun tuon tässätapauksessa 20-numeroisen 3 kantaisen luvun kertoo tuolla alkuperäisellä binääriluvulla!

Luvut ovat toki tietokoneen muistissa binäärisiä, mutta eihän se muuta tosiasiaa, että esimerkiksi binääridesimaali 0.000110011, lasketaan kympeiksi vain kertomalla tuo vaikkapa 10^20:llä, siitä saadaan alle 20-numeroinen 10-järjestelmän luku, ja nollia tulee pilkun oikealle puolelle. Sitten tuo kokokanaislukuosan puolelle tullut luku saadaan samoin desimaaliseksi jakamalla tuota binäärilukua koneen kovolla 10:llä ja pistämällä jakojäännökset talteen...

Mutta, kun kertolasku on lopulta valmis se mahdollistaa esimerkiksi:
2^(8192*29)=10^x | log10
x=8192*29*log10 2= 71515-numeroisella desimaaliluvulla laskemisen.

Kerto ja jakolaskun olen toteuttanut aivan samoilla laskusäännöillä, kun tavallisessa allekkainlaskussa. Kertolaskussa kerrotaan jokaisella yksittäisellä "sanalla" luvun jokainen sana, liikutetaan sitä paikan mukaan tietokoneenmuistissa ja lasketaan sitten tulokset yhteen.
Osamäärä samoin. Kun otetaan jakojäännös talteen, ja lisätään nollien sijasta uusia pätkiä luvusta muistissa, on sekin ollut helppoa toteuttaa...

Ainoa harmin aihe on tuo kummallinen 29-bittiä! 31. bitti on etumerkki, ja 30 on varattu yhteen ja vähennyslaskussa muistibitiksi, kun ylitetään yksittäinen 29-bittinen lukumäärä(536870912) ja lisätään ykkönen seuraavan merkitsevän "lukusanan" lukemaan...

Toki 29-bittiä on alunperin sangen huvittavalla shortilla laskettuani aivan hulppea parannus(short, 16 bittiä=-32767=>+32767). Etumerkkiä en siis käytä, sillä se on erikseen flaggimuuttujassa, jossa on imaginäärisyydelle ja nollalla jakamisille(derivoitaessa on nollalla jaollakin merkitystä) oma flagginsa.

Mutta totta: "32 bittiä kertaa 32 bittiä on 64 bittiä!" Onneksi C++ kääntäjässäni on lukutyyppi: __int64 joka mahdollistaa tuollaisten lukujen kertomisen. Lisäksi siinä on funktio: Int64ToInt, joka muuntaa ne takaisin tuollaisiksi 29-bittisiksi luvuiksi, kun oikeat 29+29 bitin palaset on ANDATTY ja jaettu kerrottaessa ja jaettaessa paikoilleen!

Mutta vielä kaipaisin jotain vinkkejä, miten trigonometriset funktiot kannattaa muuntaa? Taulukkokirjojen kaavoilla? Mitään taulukkoa ei kannata tehdä lasketuista luvuista, sillä 10^71000 luku on niin suuri, ettei IKINÄ saataisi niin suurta muistia, että tuollaisen tulokset voisi tallettaa... Täytyy siis tyytyä laskemaan kullekin kulmalle tai ARCILLE:kolmion sivujen suhteille aivan joka kerta uusi ja autenttinen arvonsa.

Kone laske melko nopeasti onhan HP-fläppärini nopeus useita Gigahertsejä(Miljardi värähdystä sekunnissa), ja niinpä laskentakin useita MIPSEJÄ!(miljoonia laskutoimituksia sekunnissa)

Seuraava projekteni on tehdä C++ sama ohjelma kun tein vanhalle pöytä-HelvettiPaskardilleni Basicille, eli symbolisia polynomeja yhdistelelevä ohjelma. Se osasi jo yhdistää missä tahansa järjestyksessä esitetyt polynomit ja laskea sulkuja pois... Homma jäi hivenen kesken, ja on tuo vanha Windows98-koneeni naftaliinissa.

Ja se tärkein ja vihoviimeisein projektini on tehdä tekoäly muutamalle rakastamalleni älypelille: Jätkänshakki(Gomoku), Go ja Shakki... Niille olen miettynyt ja valmiit algortymit.

Vahinko vain, että esimerkiksi Gossa on noin 10^170 erilaista lautaa, tietyillä vanki- ja aluemäärillä, eikä tuollainenkaan luku ole mahdollista tallentaa. Tietokoneen muistihan ja kovalevyn muisti on vain muutamia kymmeniä gigatavuja(10^10 kpl (8-64) bittistä tavua)

Shakkipelistä ajattelin tehdä täysin "sokean", eli se vain laskee suoranaiset matit ja materiatilanteet, ja kun laskenta etenee, se löytää KAIKKI siirrot, joita on huomattavasti vähemmän kuin Go:ssa.13^64 max, jos nappuloita voi olla mitä tahansa määriä. Todellisuudessa tuo luku lienee noin 10^40, siis mahdollisten shakkipelien lukumäärä, kun otetaan huomioon, että on vain 2*6 nappulaa+tyhjäruutu, ja niitäkin vain 32 kappaletta. Varmaan laskentasyvyyttäkin kannattaa tehdä, eli kaikkia edellisiä siirtosarjoja ei kannata hukata, vaikkapa algorytmi päivittää kutakin siirtoa kohden vain sen hetkisen materiatilanteen, kunkin laskentasyvyyden päätteeksi.

Tälläinen vuodatus tästä tuli, toivottavasti ei menny ihan pelkästään pipariksi...

Sivut

Kommentit (113)

Vierailija
Agison
Ai mikä on valmis?
No, hulppealla 8192 kpl:eella 29 bittisiä lukuja laskeva C++ ohjelmani!
..
Tälläinen vuodatus tästä tuli, toivottavasti ei menny ihan pelkästään pipariksi...



Onnea vaan taiteilijalle uurastuksesta!

Hauskaa nähdä aitoa intoa.. hyvähyvä!

Vierailija
re
Onko sulla mitään lääkitystä? Ees alkoholia??



Just joo. Tuon on tarkoitus olla suomalaiskansallisesti hauska vitsi?

Heti kun joku ei käyttäydy tuiki normaalisti niin hulluhan se on ja lääke on taas kansallisjuoma alkoholi..

Ollaan nyt kaikki tasahattuja sitten vai mitä. Kellään muilla kuin normaaleilla juopoilla ei saa olla kivaa ja vaan kännissä tietenkin voi olla kun ilo ilman viinaa on teeskentelyä..

Voihan maakuoppa!
Ja voihan se sosiaalidarvinistinen lajien jatkuva kamppailu ja lajin sisäinen ja kaikkien töniminen ja tuuppiminen ihan koko ajan.. Paska homma!

Kirjoitelkaa keskenänne rihvelitauluilla tai lähetelkää savumerkkejä. Tietokoneet ja koodaushan on hullujen tekemää.. PÖÖ!

Vierailija
sakkimies
agison!!! pelaatko shakkia!! otetaanko matsi?



Miten? Syötäpä vaikkapa siirtosi tänne, ja kommentoi sitä oikein ahkrasti! Jos aloitan.

Agison vs. Sakkimies
1. e4, mikä on vastauksesi?

Siirrätkö ratsua, jota käyn kyllä heti sotilaalla ahdistaan, jos se on 1/4 niistä ratsun aloitussiirroista?!

Vierailija
Pönni
Agison
Ai mikä on valmis?
No, hulppealla 8192 kpl:eella 29 bittisiä lukuja laskeva C++ ohjelmani!
..
Tälläinen vuodatus tästä tuli, toivottavasti ei menny ihan pelkästään pipariksi...



Onnea vaan taiteilijalle uurastuksesta!

Hauskaa nähdä aitoa intoa.. hyvähyvä!




Tajusin juuri, että on parempi käyttää niitä tuttuja ja turvallisia 16-bittisiä! Ei mee yhtään bittiä hukkaan laskettaessa! Ja tuloskin on TAKUULLA tiedossa, sillä sehän on 0-65536, ja kertolaskun jälkeen 4294967296 maximissaan.

Tuon lukun käsittelyyn toki tarvitaan __int64, sillä käsittääkseni ei ollut olemassa komentoa :unsigned Int64ToInt. Mut jos on, niin sitten toki käytän sitä! Pitänee kohta tarkistaa assia...

Mutta EN pitäisi ihteeni pelkkänä taitelijana, vaan todellisena TEKIJÄNÄ, jonka kykyjä on pahasti aliarvostettu vain...

Vierailija
re
Onko sulla mitään lääkitystä? Ees alkoholia??



Oha mulla! Mm. Klarkulla(Clorproman) pölähtää naama tulipunaiseksi aina aurigossa!

Vierailija

Voi olla että mulla on nuppi vähän jäässä kesälomien jälkeen mut siis mitä tuo ohjelma nyt oikein tekeekään??

Eihän tuo ole tähänkään asti ollut mikään "ihme" varata vaikka 2x9000bittiä muistia ja OR:ta tms. ne keskenään. = yhteenlasku.. ja samaan syssyyn duunaa muita laskutoimituksia..

Vierailija

Tulee vain pakostakin mieleen South Parkin jakso, jossa Mr. Garrison kehitti laitteen nimeltään "It". Ohjausmekanismi oli vähintäänkin mielenkiintoinen.

Vierailija
artsi
Voi olla että mulla on nuppi vähän jäässä kesälomien jälkeen mut siis mitä tuo ohjelma nyt oikein tekeekään??

Eihän tuo ole tähänkään asti ollut mikään "ihme" varata vaikka 2x9000bittiä muistia ja OR:ta tms. ne keskenään. = yhteenlasku.. ja samaan syssyyn duunaa muita laskutoimituksia..




Yhteen ja vähennyslasku on nyt lopullisen valmis!
Palasin järkiini tuon taktisen harhautuksen jälkeen, että mukamas 29-bittisiä lukuja! Tietysti 32 bittisiä ja ylin on etumerkkibitti, voi käyttää suoraan kovoa, eikä suurtakaan ehtorakennelmaa eikä looppeja tarvittu, kuin sen havaitsemiseen, milloin mennään yli +-2147483647:stä. Ai mitenkö? No, ottamalla tyyppi __int64-käyttöön, jolloin ylittävät arvot voidaan ynnätä tai vähentää summa taulukosta... Se pikku vihjeenä, jos tahdotte tehdä saman! Toki pitää lainata 1, ja lisätä 1:stä mahdollisesti monestakin intistä, jos kaikki yhteen/vähennettävät sattuvat olemaan rajalla. (vähän kuin +-9, mutta vain ISOMMALLA luvulla)

Mutta se mihin en tiedä vielä kovin monen ryhtyneen, on se, että muutetaan lukuja ties millä kantaluvuilla! Ylesimmäthän ovat 2(binääri), 8(oktaali), 10(desimaali) ja 16(heksadesimaali)-järjestelmät! Parittomat lukujärjestelmät ovat erityisen mielenkiintoisia!

Miten se tapahtuu, no >0 lukuja vaan jaetaan kantaluvulla ja otetaan jakojäännös talteen... Murtomaaliosa(esim 0.000001) muutetaan vaan kertomalla n^m:llä missä m on numeroiden lukumäärä ja n kantaluku ja sitten samoin muuttamalla, lisäämällä nollia, jos jäädään alle m:n.

Muiden kantalukujen, maximina tietysti toi 2miljardijärjestelmä(joka voidaan toteuttaa tavallisilla sanoilla), suhteen pitää ottaa käyttöön mahdollisesti muitakin merkkejä kuin normaalit 0-9 lukuamme. Kuten heksoissa ja sitten kun mennään yli 30, mahdollisesti muita kirjainyhdistelmiä ja välimerkkejä...

Se on helppo toteuttaa vaan pistämällä taulukkoon kutakin kantaluvun välinumeroa vastaava "merkki/lukujono"!

Sepä täältä tänään, Sopimusvuori Oy:ta jälleen mainostaen!(ILMAISEKSI!)

Vierailija
sakkimies
c 7 - c5 tietokonetta ei kai sitten käytetä, vai mitä?



Agison vs. Sakkimies
1. e4 c5
2. b3 ??

Lähetille aukko, eikä sotilas pääse suotta eteneen!

Vierailija
sakkimies
ratsu b 8- c 6



Juu. Totakin muunnelmaa on tullu jo kelattua ainakin 15. siirtoon asti... Eikä kummallekaan mitään hyötyä...

Mutta ainahan voi katsoa, jos toinen tekisi virheen!

Agison vs. Sakkimies
1. e4 c5
2. b3 Rc6
3. Lb2 ...

Piispa kivaan poseen...
Tuo vain ratsu tohon niin varmaankin syän!.
Tai jos toinen ratsu, niin omakin on otettava peliin!

Sivut

Uusimmat

Suosituimmat