Index
Index forum Index forum
Autentificare Autentificare
Inregistrare Inregistrare
Cine este online Cine este online
Galerie imagini Galerie imagini
Calendar evenim. Calendar evenim.
Cautare detaliata Cautare detaliata
Ghid forum Ghid forum
Album astrofoto
IMG_7413_[640x480].jpg
Imagine aleatoare
Blog
Inregistreaza-te pe forumul astronomy.ro
Colaboratori

Te intereseaza un domeniu al astronomiei si ai vrea sa scrii pentru siteul nostru? Alatura-te echipei noastre.

Meteo
Vremea in Bucuresti
Statistici forum
Numar total de mesaje in forum: 224726
Numar de utilizatori inregistrati: 2837
Cel mai nou utilizator inregistrat: Adrian T.
Cei mai multi utilizatori conectati au fost 543 la data de Vin Mar 29, 2024
Actualmente sunt 0 utilizatori pe chat   
Aceste date se bazeaza pe utilizatorii activi de peste 5 minute
Legenda
Mesaje noi Mesaje noi
Nu sunt mesaje noi Nu sunt mesaje noi
Forumul este inchis Forumul este inchis

DIY ASCOM powerbox


Du-te la pagina Anterioara  1, 2, 3, 4  Urmatoare
Creaza un subiect nou   Raspunde la subiect  

DIY / ATM / Reparatii

Subiectul anterior :: Subiectul urmator  
Afiseaza mesajele pentru a le previzualiza:   
Autor Mesaj
varadinagypal
Membru
Membru


Data inscrierii: 27 Iul 2013
Mesaje: 186



Localitate: Cluj-Napoca

MesajTrimis: 11 Feb 2024 12:33 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

De obicei, cand vin juniorii -- fiindca faculatea invata avioane in baza 13 si 16, dar nu si asta lucrurile importante, ma uit la tine acum, Babes-Bolyai -- , le dau exercitii de gandire de genul:

x == (x+1)
ori
(7*n) != (n+n+n+n+n+n+n, sper ca am scris de sapte ori)

si sigur se vor uita ciudat, ce vrea nenea cu "practica vs teorie". Tocmai ca nu, ca tot teorie e: nenea vorbeste despre alte avioane, complexitati si densitatea de informatie, sfidarea distributivitii si asociativitatii din cauza acumularii de erori de rotunjire, parfumuri din astea care devin importante cand comparam margini sau formulam SQL, ori devin perechi de adevarat-fals in functie de abordare, si in SQL va functiona intr-un fel (ca rotunjeste sau nu la doua zecimale), or

de ce oare, in softul meu de astro, in loc de arcsinus folosesc safeArcsinus?

Ori, de pilda acest "unit-test":

Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio>
#include <stdint>
int main(){
uint32_t uintA = 0xFFFFFF00;
float floatA = (float) uintA;
uint32_t inspectionStart = uintA+1;
uint32_t inspectionEnd = inspectionStart+128;
for (uint32_t a = inspectionStart; a < inspectionEnd; a++){
int e = ((float)a == floatA);
printf("Expecting 0 (not equal), getting %d %s for (%lu == %0.f)\r\n", e, e ? "(__equal__)" : "(not equal)", a, floatA);
}
return 0;
}
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4796

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 11 Feb 2024 21:33 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘uint32_t’ {aka ‘unsigned int’}

Poate asa este mai intuitiv ce se intampla cand inghesui 32bit de UINT in 23bit de FLOAT:
Cod:
printf("getting %d %s for (UINT a %u to (float)a %0.f == FLOAT %0.f)\r\n", e, e ? "(__equal__)" : "(not equal)", a, (float)a, floatA);

getting 1 (__equal__) for (UINT a 4294967041 to (float)a 4294967040 == FLOAT 4294967040)
...
getting 1 (__equal__) for (UINT a 4294967167 to (float)a 4294967040 == FLOAT 4294967040)
getting 0 (not equal) for (UINT a 4294967168 to (float)a 4294967296 == FLOAT 4294967040)


Dar deocamdata nu stim care a fost problema.
Parerea mea este ca ar fi trebuit sa mearga si cu float la ce fel de calcule se fac, chiar daca este f. ineficient. Poate e de vina doar ordinea in care se fac calculele, formulele matematice 'corecte' presupun o precizie infinita. La fel de bine poti s-o dai in bara si cu DOUBLE64, si pe 128 ... un clasic exemplu este Windows Calculator ... calculezi radical din 4 iar din rezultat scazi 2 ... vezi cei iese Smile
Sus
AVD
Membru
Membru


Data inscrierii: 04 Iun 2022
Mesaje: 87



Localitate: Dudu

MesajTrimis: 12 Feb 2024 14:50 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

nobody a scris:
Ai niste exemple concrete sa le testez ?
O bucata de cod care nu functiona cum te asteptai sau chiar exemple de pe site-ul arduino.

Probleme de genul asta se pot rezolva cu 'type casting', chiar compilatorul iti mai da warning-uri ca este o situatie ambigua. Asta daca nu sunt chiar bug-uri, double e cam buggy in AVR gcc, dar float ar trebui sa functioneze.

P.S.
Daca e vorba de rotunjiri si trunchieri de precizie la float ca aici:
https://forum.arduino.cc/t/strange-float-or-rounding-error/469408
atunci este si o problema de optimizare a formulelor, sau a unitatilor de masura alese.
Float-ul poti sa-l consideri ca o scara logaritmica, rezolutia este relativa la ordinul de marime.
De ex. daca aduni un numar mic la un numar mare, vei pierde din precizie la numarul mic, sau il pierzi chiar de tot.


Exact exemplul pe care l-am dat: am incercat sa calculez tensiunea folosind valoarea masurata la pin-ul analogic (care era masurata prin divizorul de tensiune) impartita la raportul dintre valorile rezistoarelor din divizorul de tensiune. Le-am pus in doua constante, vdiv1 si vdiv2.

int vdiv2 = 100800
int vdiv1 = 10000
double volt_temp
double volt;

[...]

volt_temp = (media valorilor masurate in 150 de sample-uri)
volt = volt_vemp / (vdiv1/vdiv2).



Acel raport ar fi trebuit sa dea 0 .992, dar, in formula, a fost tratat doar ca 0.99.

Tin sa mentionez (deoarece am vazut ca am intrat in detalii despre codare): Nu am un background prea stufos de codare. Am invatat codare in pascal si C++ in liceu, acum mai bine de 10 ani si, de atunci, nu am mai avut contact cu acest domeniu (cu exceptia micilor proiecte arduino, dar foarte rar).
Sus
auriga
Membru
Membru


Data inscrierii: 22 Dec 2008
Mesaje: 2114



Localitate: Cluj-Napoca

MesajTrimis: 12 Feb 2024 15:09 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Tocmai la UBB se tine un curs de Radu Trambitas numit Calcul Numeric unde se studia si Teoria erorilor si aritmetica ın virgula flotanta.
Sus
varadinagypal
Membru
Membru


Data inscrierii: 27 Iul 2013
Mesaje: 186



Localitate: Cluj-Napoca

MesajTrimis: 12 Feb 2024 15:30 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

prima chestie e

int x = 123456 // mai mare decat 16 biti, chiar si fara bitul de semn
...
cat e range-ul intului pe arduino uno (sau nano, 328P e nucleul, hint: e garantat sa aiba minim 16 biti, dar...)?

https://www.geeksforgeeks.org/int-1-sign-b...word-in-c/

a se observa diferenta dintre int, long int, si int32_t si int64_t, respectiv daca era pe esp32 int-ul era...

INT_MAX, sizeof(int),

si mai vezi notatia cu de UL de pilda -- cand unei constante hard coded ii fortam marimea, e o nebunie cu type promotion etc

uint32_t x = 1234567UL;
Sus
varadinagypal
Membru
Membru


Data inscrierii: 27 Iul 2013
Mesaje: 186



Localitate: Cluj-Napoca

MesajTrimis: 12 Feb 2024 15:42 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

auriga a scris:
Tocmai la UBB se tine un curs de Radu Trambitas numit Calcul Numeric unde se studia si Teoria erorilor si aritmetica ın virgula flotanta.


mie mi-a tinut curs doamna Lector Doctor. Cand s-a prezentat, in loc sa inceapa cu eu sunt, zic si eu un nume, Sanziana, a inceput cu: "Eu sunt Lector Doctor ..." -- si am decis ca numele oamenilor de acest soi, cu iz de inginer-academician-prof-univ-codoi nu merita sa il retin.

Deci doamna Lector Doctor ne-a predat acolo cu virgula flotanta, conversii pe hartie, apoi a instistat, tot conversii pe hartie, cu baza 13 si baza 7, pe langa cele traditionale, de 10, 16 si eventual 8. Foarte fain la adunare si inmultire, cu latimea de biti, si cu complementul lui mami. DAR de carry flag din procesor nimic, de bitii extra la float din procesor, nimic, de erorile de rotunjire in practica - desi rezulta din teorie, asta recunosc - dar nimic in practica.

Norocul meu ca stiu din astea pe cont propriu, si m-am inscris ulterior la faculte, doar pentru hartie, sa am si eu diploma, sa nu comenteze vreo HR-itza desteapta cand imi pune CV-ul in teancul verde sau in folderul spam.

Deci UBB, ai tu un deget mijlociu din partea mea, bine ca ne miram de ce tampiti ne vin la interviu, ca interni sau ca juniori, cu acte in regula si pretentii de "om diplomat" si banii arabiei saudite ca salar.
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4796

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 13 Feb 2024 06:03 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

varadinagypal a scris:
prima chestie e

int x = 123456 // mai mare decat 16 biti, chiar si fara bitul de semn
...
cat e range-ul intului pe arduino uno (sau nano, 328P e nucleul, hint: e garantat sa aiba minim 16 biti, dar...)?


Din prima incercare pe Arduino:

Cod:
warning: overflow in implicit constant conversion [-Woverflow]
 int vdiv2 = 100800;


Table 1. Data Types on AVR 8-bit Microcontrollers in <stdint>
Data type Size
signed char / unsigned char = int8_t / uint8_t = 8-bit
signed int / unsigned int = int16_t / uint16_t = 16-bit
signed long / unsigned long = int32_t / uint32_t = 32-bit
signed long long / unsigned long long = int64_t / uint64_t = 64-bit
Sus
AVD
Membru
Membru


Data inscrierii: 04 Iun 2022
Mesaje: 87



Localitate: Dudu

MesajTrimis: 13 Feb 2024 13:14 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Daca tot am deturnat, din nou, pagina de proiect in discutii si tutoriale, sa adaug si eu ceva:

Cred ca am reusit sa imi rezolv problema. Aparent, daca impart 2 variabile int (fie ele long, uint16, uint32, etc.), nu va merge. Solutia a fost sa fac acele doua variabile de tip float si sa le adaug .0 la final.

Exemplu despre ce vreau sa spun in urmatoarele poze.

Logica mie mi-ar dicta ca nu are de ce sa functioneze ce am facut eu, pentru ca rezultatul impartirii il atribui unui numar float, deci nu vad de ce numerele de dinainte nu ar putea sa fie int.
Cel mai sigur imi scapa modul in care microprocesorul executa, de fapt, operatia de impartire.

Disclaimer, din nou: Nu sunt programator de meserie, n-am mai pus mana pe cod din liceu, de peste 10 ani. Go easy on me Very Happy



uint.png
 Descriere:
 Marime fisier:  54.62 kb
 Vizualizat:  de 524 ori

uint.png



float.png
 Descriere:
 Marime fisier:  59.4 kb
 Vizualizat:  de 524 ori

float.png


Sus
valy
Membru
Membru


Data inscrierii: 21 Iul 2005
Mesaje: 10653



Localitate: Bucuresti

MesajTrimis: 13 Feb 2024 13:30 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Sunt importante tipurile, sunt importante cast-urile automate, fiecare cu regula lui.
Impartirea e cea mai parsiva operatie, cateodata chiar si simpla adunare, de ex daca incrementezi 0 cu 0.01 de 100 de ori la final o sa ai anumite surprize...
Testarea este importanta, modul cum functioneaza compilatoarele, limbajele, hardwareul este important, chiar si cum definesti o simpla constanta poate fi crucial.

Este si o capcana asta cu sistemele "simple" gen arduino, cat timp te joci si aprinzi un led acasa e ok, cu conditia sa nu dai foc la ceva Smile


AVD a scris:
Logica mie mi-ar dicta ca nu are de ce sa functioneze ce am facut eu, pentru ca rezultatul impartirii il atribui unui numar float, deci nu vad de ce numerele de dinainte nu ar putea sa fie int.

De obicei cast-ul se face la atribuire, atunci se schimba tipul, impartirea ia tipul operanzilor:
float x = 1/3 -> x = 0

Sunt multe reguli implicite, implicate in programare, ca sa mearga treaba trebuie sa le cunosti. Din pacate nu gasesti nicaieri lista completa a lor, pe care daca o inveti gata esti programator certificat. Si astfel se pune intrebarea cum de merg aplicatiile facute de programatori?! Sunt unii care stiu regulile si le aplica, sunt altii care verifica ce au facut unii. Daca cel putin una din categorii isi face treaba, ai sanse (relativ mici) ca programul sa mearga (relativ) ok.


Ultima modificare efectuata de catre valy la 13 Feb 2024 13:54, modificat de 1 data in total
Sus
varadinagypal
Membru
Membru


Data inscrierii: 27 Iul 2013
Mesaje: 186



Localitate: Cluj-Napoca

MesajTrimis: 13 Feb 2024 13:54 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

putina practica
=========

atribuirea se face la un float, dupa ce operatia s-a facut asupra unor inturi.


putine teorie
========

Daca te-ai intalnit cu notatia poloneza care reflecta precedenta, asociativitatea etc:

1*(2+3) se scrie *+2,3,1

// varianta pentru muritori, cu functii de prototip: numar operator(operand1: numar, operand2: numar)

mul(1, add(2,3))

Sa se sesizeze ca si conversiile de tip (cast) dar si integer/float promotion (de pilda la sprintf, chiar si cand ele nu sunt scrise explicit) sunt functii cu un singur operand: f(x): y

unde x si y sunt variabile, adica perechi de { tip, valoare }

practica
=====

astfel, mai pe C-lang

int x = 3
int y = 1
int z = 1
// float a = toFloat(integerDivision(x, intAdd(y, z))
float a = x / (y+z);

rezultat: a == 1.00000000

teorie de limbaj si compilator
==================

python si cu javascript si cu php si c# si c si c++ si ce o mai fi, in functie de preferintele celor care au facut/comandat limbajul, de strictetea si garantiile / lejeritate care trebuie date de parser/compilator, la compiletime/runtime,

au alte idei despre type-inference, type-conversion, rotunjiri, despre teoria de tipuri, adica despre {tip, valoare} in general si conversiile de {tip1, valoare1} => {tip2, valoare2}, despre operator overload, in cazul c++ de pilda explicit, ori implicit la javascript unde problemele incep cu ordinea de numar+string sau string+numar, + fiind cu overload pentru concatenare si adunare aritmetica, dar - fiind doar scadere aritmetica

iti recomand, pe langa manualele de facultate sau liceu, unele de kkt, altele chiar bune, serialul lui Bartosz Milewski de pe youtube, despre teoria categoriilor, daca te intereseaza astfel de perversiuni intelectuale. Ca in practica, fix de din astea te vei lovi, si in python, si in C
Sus
AVD
Membru
Membru


Data inscrierii: 04 Iun 2022
Mesaje: 87



Localitate: Dudu

MesajTrimis: 13 Feb 2024 14:58 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Multumesc de recomandari!

Am rezolvat si problema cu PWR_TOTAL, si anume calculul ei in 2 pasi, cu PWR_TOTAL_S, apoi TOTAL_H. Aceeasi rezolvare: time1 si time2 ii initiam ca si long. I-am initiat ca float si acum nu mai am nicio problema. De asemenea, am facut un artificiu care sa imi masoare/estimeze puterea consumata intre cicluri.

time1=millis();
[...]
PWR_TOTAL = PWR_TOTAL+ ((((prev_pwr+PWR)/2)*(time1-time2))/3600000); // total power in W*h
prev_pwr=PWR;
time2=millis();
PWR_TOTAL = PWR_TOTAL+ ((PWR*(time2-time1))/3600000); // total power in W*h

Sper ca se intelege ce am vrut sa fac aici: tin minte puterea din ciclul trecut, fac media cu puterea din ciclul asta si le inmultesc cu diferenta de timp intre finalul ciclului trecut si inceputul ciclului actual. Apoi atribui valori noi pentru prev_pwr si time2 si calculez puterea consumata in ciclul curent.
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4796

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 13 Feb 2024 15:03 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Un pic mai simplu, asta depinde de cum interpreteaza compilatorul, microprocesorul doar executa codul generat de compilator.
AVD a scris:
Logica mie mi-ar dicta ca nu are de ce sa functioneze ce am facut eu, pentru ca rezultatul impartirii il atribui unui numar float, deci nu vad de ce numerele de dinainte nu ar putea sa fie int.
Cel mai sigur imi scapa modul in care microprocesorul executa, de fapt, operatia de impartire.

Disclaimer, din nou: Nu sunt programator de meserie, n-am mai pus mana pe cod din liceu, de peste 10 ani. Go easy on me Very Happy


Daca faci o atribuire de genul
float_c = int_a / int_b
compilatorul (implicit dupa primul operand int_a) face impatirea ca intregi si pe urma atribuie rezultatul intreg la float

Daca vrei un rezultat in float trebuie sa-i spui explicit sa trasforme primul operand in float
float_c = (float)int_a / int_b

In schimb daca primul operand este deja float, nu mai este nevoie de casting (dar nici nu strica):
float_c = float_c / int_b;

Am facut un exemplu mai jos cu uint16_t ca sa se vada si un overflow.

Cod:

#include <stdio>
#include <stdint>

int main()
{

uint16_t int_a = 100000;
uint16_t int_b = 7;
float float_c;

float_c = int_a / int_b;
printf ("int overflow:             int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

int_a = 100;
float_c = int_a / int_b;
printf ("implicit int division:    int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

float_c = (float)int_a / int_b; // type casting to float
printf ("explicit float division:  int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

float_c = 100;
float_c = float_c / int_b;
printf ("implicit float division:  int_a = %6i  int_b = %i  float_c = %18.12f\n", int_a, int_b, float_c);

    return 0;
}

main.c: In function ‘main’:
main.c:15:18: warning: unsigned conversion from ‘int’ to ‘uint16_t’ {aka ‘short unsigned int’} changes value from ‘100000’ to ‘34464’ [-Woverflow]
   15 | uint16_t int_a = 100000;
      |                  ^~~~~~

int_a overflow (100000)   int_a =  34464  int_b = 7  float_c =  4923.000000000000
implicit int division:    int_a =    100  int_b = 7  float_c =    14.000000000000
explicit float division:  int_a =    100  int_b = 7  float_c =    14.285714149475
implicit float division:  int_a =    100  int_b = 7  float_c =    14.285714149475
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4796

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 13 Feb 2024 15:26 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Inca nu mai ai nicio problema ... inca ... dar ai o potentiala pierdere de precizie de la 32 bit (unsigned long) la 23 de bit (float) care poate duce la "Catastrophic cancellation" https://en.wikipedia.org/wiki/Catastrophic_cancellation
AVD a scris:
Aceeasi rezolvare: time1 si time2 ii initiam ca si long. I-am initiat ca float si acum nu mai am nicio problema.

millis() Number of milliseconds passed since the program started. Data type: unsigned long
Sus
valy
Membru
Membru


Data inscrierii: 21 Iul 2005
Mesaje: 10653



Localitate: Bucuresti

MesajTrimis: 13 Feb 2024 15:41 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Acel /360000...se aplica tuturor termenilor, fiecare aplicare duce la erori de aproximare, nu mai bine il aplici o singura data?

x/2+y/2 = (x+y)/2

Asa ai si optimizare, 3 vs 2 operatii per total.

Operatiile pe int sunt de obicei mai rapide si mai eficiente energetic decat float/double, la numarator poti face calcule doar pe int. O alta optimizare.
Casturile consuma si ele timp.

Dar sa vezi, tot adunand, sa nu depasesti capacitatea tipului de date.
Sus
AVD
Membru
Membru


Data inscrierii: 04 Iun 2022
Mesaje: 87



Localitate: Dudu

MesajTrimis: 13 Feb 2024 15:59 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Nu inteleg la ce te referi cu acel /3600000 care se aplica tuturor termenilor si poate fi aplicat o singura data... cum adica sa il aplic o singura data? Mie din calculul ala imi pare ca asta fac.. impart puterea calculata * timpul in milisecunde la 3600000, sa o transform in W*h.


Chiar nu imi pot da seama cum as putea imbunatati aici calculul, incat sa si functioneze cum trebuie. PWR total nu va depasi niciodata float, cu siguranta. time1 si time2, insa, cresc foarte rapid. Nu stiu daca pot depasi float intr-o sesiune de observatii, care va dura, in medie, sa zicem, 5 ore maxim. 5h * 3600000 inseamna 18 milioane de milisecunde.
Sus
Afiseaza mesajele pentru a le previzualiza:   
Creaza un subiect nou   Raspunde la subiect   DIY / ATM / Reparatii Du-te la pagina Anterioara  1, 2, 3, 4  Urmatoare

Download topic
Pagina 3 din 4
 
Mergi direct la:  
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Nu puteti atasa fisiere in acest forum
Puteti descarca fisiere in acest forum
© 2015 astronomy.ro
Termeni si conditii generale      Termeni si conditii forum      Contact