Kuu tõusu- ja loojangu ajad
#31
(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?
Vasta
#32
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.
Vasta
#33
(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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
double rint(double x);
int ig;
float fg;
int main(int argc,char *argv[])
{
int i1, i2, i3, iF,ir;
float f1, fa, fi, fa1,fa2;
    fg=(int) 345.789;
    ig=3.4;
    f1=-123.656;
    i1=-1;
    i2=3;
    i3=3.4;
    iF=f1;
    ir=rint(f1); // Ümardab.
    fa=17.3/2.0;
    fa1=17.3/2;
    fa2=17/2.0; //Kui üks operand on float, on tulemus float
    fi=17/2;    //Kui kõik operandid on int,on tulemus int
    printf("fg=%f  ig=%d\n"
        "A=%d K=%d P=%d F=%f iF=%d ir=%d \n"
        "fa=%f fa1=%f fa2=%f fi=%f\n",
        fg, ig,
        i1, i2, i3, f1, iF, ir,
        fa, fa1, fa2, fi);
    return 0;
}
_____________________
Kui midagi on viltu siis ma pole ju mingi matemaatik.
Vasta
#34
(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.
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.

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.
Vasta
#35
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.
Vasta
#36
Õ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/htmlh...ns/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...
Vasta
#37
(12-06-2012, 09:49 PM)felch Kirjutas: vaatamata trigo f-nide C18 keelest välja "tõstmisele" ja asmi
porteerimisele jääb arvutustäpsusest ikkagi väheks (4 kohta peale koma pole piisav !)
C18
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 Sad
Kas seal ei olnud double lib?
Vasta
#38
(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 ?

Vasta
#39
(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. Smile
Vasta
#40
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?
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 9 külali(st)ne