Kuu tõusu- ja loojangu ajad - Printerisõbralik versioon +- Elektroonikafoorum.com (https://elektroonikafoorum.com) +-- Foorum: Arutelud (https://elektroonikafoorum.com/forum-3.html) +--- Foorum: Arvutid ja tarkvara (https://elektroonikafoorum.com/forum-15.html) +--- Teema: Kuu tõusu- ja loojangu ajad (/thread-373.html) |
RE: Kuu tõusu- ja loojangu ajad - A.R. - 16-05-2012 (16-05-2012, 09:11 AM)felch Kirjutas: Hetkel jääb mulje, et päevi ei arvestata - saan ju RTC kivi kalendrilt alati täisarvud!Proovi. Lac=59.43 Pic=24.75 Avc=-3 2012 4 15 Ja siis Lac=59.43 Pic=24.75 Avc=-3 2012 4 16 Tulemus muutub - järelikult tunneb päeva. MOTT Kas Kuu ka teab et ta nii liikuma peab? RE: Kuu tõusu- ja loojangu ajad - felch - 23-05-2012 Samal teemal: kas on funktsiooni C keeles, mis teisendaks murdarvu täisarvuks? Sama Kuu aegade arvutuse juurde läheb vaja. VB6 ütleb nii: int(-0.318)=-1 ja int(0.318)=0 C-keeles seepärast et siis saaks algoritmi asmi ümber porteerida. ASMi mati lib'is on küll f-n INT3232 aga see lõikab lihtsalt peale koma kõik maha. Arctan funktsiooni ma porteerisin c'st asm'i, töötab küll. RE: Kuu tõusu- ja loojangu ajad - A.R. - 24-05-2012 (23-05-2012, 08:30 PM)felch Kirjutas: Samal teemal: kas on funktsiooni C keeles, mis teisendaks murdarvu täisarvuks?C keeles peaks iga muutuja olema defineeritud. Milline täisarv, kas märgiga või märgita char (1 bait) short 2 int 4 long 4 long long 8 int128 16 baiti Ujukoma float 4 baiti double 8 long double 12 qfloat 56 Kui kasutad lcc-32, siis seal on see HELP all kirjas. __________________________________________ Kood: //Natuke näidet Kui midagi on viltu siis ma pole ju mingi matemaatik. RE: Kuu tõusu- ja loojangu ajad - tvtv - 24-05-2012 (23-05-2012, 08:30 PM)felch Kirjutas: Samal teemal: kas on funktsiooni C keeles, mis teisendaks murdarvu täisarvuks? Sama Kuu aegade arvutuse juurde läheb vaja. Mitu varianti on, üks variant on type casting, google abiks. Näide: double d = 1.2345; int i = (int)d; // == 1 Teine variant on math.h teegi funktsioonid floor() ja ceil(). Mis annavad siis lähima täisarvu alt või ülevalt. Kui tahad mitut komakohta, siis lahendus on midagi sellist (2 kohta peale koma antud näites): double d1 = ((int)(100.0*d))/100.0; // NB! jagajaks kindlast "100.0" ja mitte "100". P.S FP arvud käituvad imelikult teatud juhtudel. Näiteks järgmine koodijupp: int i = 0; double d = 0; for(i = 0; i < 10; i++) d += 0.1; Võiks arvata, et tulemus on 1.0 aga tegelikult pole ta seda teps mitte. Ja mis veelgi hullem, ((int)d) != 1 ! Probleemist võib lugeda siit, aga asja uba on üldiselt selles, et 0.1 ei oma täpset ja lõpliku vastet ujukoma arvude seas. Iseküsimus on, et kas sul on üldse floating-point arve vaja. Vb. saad fixed-point arvudega hakkama. ASM-is on neid arvatavasti lihtsam käsitseda. RE: Kuu tõusu- ja loojangu ajad - felch - 28-05-2012 Jah, tänud, floor funktsioon tegi seda, mida vaja. Kogu proge on nüüd asmis aga...selgub, et arvutustäpsusest ei piisa. Viga hakkab kuhjuma (eriti trigonomeetria puhul) ja nt 00:12 asemel saadakse üheks ajaks 01:23 ! Tiba palju mööda... Asmi mati librarys on 32-bitised muutujad. Äkki on kuskil olemas suurema täpsusega funktsioonid? A.R., kas sinu C-keele kood arvutas täpselt? Võrreldes netikalkulaatori tulemustega. Jaga koodi, prooviks ise ka. RE: Kuu tõusu- ja loojangu ajad - felch - 12-06-2012 Õhta! Pusisin vahepeal edasi. Esieks selgub, Microchip'i C18 annab int() vastuse kummalise - kõik peale koma võetakse maha ja ei ümardata kuhugi. Algne Kuu aegade proge (aastast 88 vist?) soosib seda lähenemist. Hüva, olgu tal siis õigus kuigi on ka teisi seisukohti (http://www.scriptlogic.com/Kixtart/htmlhelp/functions/Int.htm) Aga...vaatamata trigo f-nide C18 keelest välja "tõstmisele" jas asmi porteerimisele jääb arvutustäpsusest ikkagi väheks (4 kohta peale koma pole piisav !) ja tulemus on jama. A.R.-i C-keele näide töötab edukalt, eksimus on netikalkulaatoriga võrreldes ma 10 minutit. Kas on võimalik (või kui keerukas see oleks) kuidagi too Kuu aegade algo jätta C-keelde, võtta kompileeritud tulemus ja includida minu asmi? Ma kohe mitte ei tahaks kogu koodi nullist alustada... See sinine tuli pidi olema viimane asi selle versiooni jaoks. Järgmine veersioon...jah, seal võib juba asju paremini teha ja äkki isegi mingis muus keeles. Või...millisele tehtele tuleks tähelepanu pöörata? Äkki annab veel mõne f-ni C-st välja raputada? See töö on juba selge... RE: Kuu tõusu- ja loojangu ajad - A.R. - 13-06-2012 (12-06-2012, 09:49 PM)felch Kirjutas: vaatamata trigo f-nide C18 keelest välja "tõstmisele" ja asmiC18 On defineeritud double ja sellele antud väärtused translaator tekitas mällu sellise arvukuju: ...................v see oli viimane tundlik koht. Td1=23.123455781; 41b8fcd6 Td1=23.123456181; 41b8fcd7 Td1=23.123416781; 41b8fcc2 Td1=23.123456781; 41b8fcd7 Td1=23.123456789; 41b8fcd7 Td1=23.923456781; 41bf633d See on nüüd otse omistamine. Pole veel jõudnud sin(x) kallale Kas seal ei olnud double lib? RE: Kuu tõusu- ja loojangu ajad - felch - 13-06-2012 (13-06-2012, 08:21 AM)A.R. Kirjutas: Kas seal ei olnud double lib?C18-s on double ja float mõlemad pikkusega 32 bitti ! Aga tundub, et sellest piisab - Sinu kood annab mõistliku tulemuse, minu omal hakkab viga kuhjuma. Võrdlen Sinu koodi ja enda oma vahetulemusi peale igat arvutust. Võtsin siis SIN ja COS c-keelest üle aga ei aita midagi. Kas tõesti peab ka ülejäänud mati ringi kirjutama ? RE: Kuu tõusu- ja loojangu ajad - A.R. - 13-06-2012 (13-06-2012, 02:43 PM)felch Kirjutas: Võtsin siis SIN ja COS c-keelest üle aga ei aita midagi. Kas tõesti peab ka ülejäänud mati ringi kirjutama ?Seal MCC18 kataloogis on sincos.c programm. Mõni rida sealt: #define PI_C1 3.140625 aga #define PI_C2 9.67653589793E-4f float _sincos(float x, unsigned char flag) #define TWOPI 6.28318530717958648f y = fabs(x); if(y >= YMAX) { // y = fmod(y, TWOPI); xn = y/TWOPI; xn = (long)xn; y = y - xn*TWOPI; } Ilmselt nii kasvab jagamise täpsus. Vaata seda, vast saab selle kuu pika sin arvutuse alamprogrammis ära teha ja muutujad sellisel pikal kujul kirja panna. Ja kui seal seda jada arvutuse rida natuke pikendada siis võiks ka täpsus kasvada. Kui C kirjas siis saab ta ära transleerida ja siis on listis asm olemas. Ainult suru kokku. Kui annab. Kunagi 68. pakiti Tõraveres pikad arvud kahe muutuja sisse peitu. RE: Kuu tõusu- ja loojangu ajad - tvtv - 13-06-2012 Tekkus selline mõte, et kas sa neid tõusu ja loojangu aegu ette arvutada ei saa mingi piisavalt pika aja peale nii, et pärast PIC peab tegema ainult mingeid lihtsaid arvutusi? |