Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Impartire gresita in float
#1
Posted 25 January 2023 - 17:54
De ce impartirea aceasta in float da rezultat gresit? Nu depaseste maximul float.
sprintf(res,"float= %f",18785676818.f/15.f); |
#2
Posted 25 January 2023 - 18:15
Atat primul operand cat si rezultatul depasesc precizia de care este capabil tipul float. Adica nici primul operand nu poate fi reprezentat exact ci doar aproximativ, ceea ce deja introduce o eroare, nici rezultatul, acesta trebuind sa fie ‘rotunjit’ deci din nou o diferenta fata de valoarea exacta.
Tipul float permite reprezentarea exacta a tuturor numerelor intregi de 7 cifre zecimale si a unei parti din cele de 8 cifre. Intervalul contiguu maxim de numere pozitive reprezentabile este 0…16777216, dincolo de aceasta valoare unii intregi sunt reprezentabili dar exista ‘gauri’, intregii din aceste ‘gauri’ fiind aproximati. Edited by sags, 25 January 2023 - 18:18. |
#3
Posted 25 January 2023 - 18:22
Pentru ca este ilegal
https://www.tutorial...c_constants.htm int main() { printf("float= %f\n",18785676818.f/1.f); printf("float= %f\n",18785676818.f/1.0); printf("float= %f\n",18785676818.0/1.f); printf("float= %f\n",18785676818.0/1.0); return 0; } Quote float= 18785677312.000000 float= 18785677312.000000 float= 18785676818.000000 float= 18785676818.000000 Edited by MarianG, 25 January 2023 - 18:23. |
#4
Posted 25 January 2023 - 18:27
De ce ilegal? Este perfect legal: constantele contin punct zecimal deci e tip de virgula mobila (nu e obligatoriu sa ai SI parte intrega SI zecimale, e suficienta una din ele, si nu e obligatoriu sa specifici exponent daca ai punct zecimal), iar f este sufix ce indica tipul float ca altfel ar fi double.
|
#5
Posted 25 January 2023 - 18:30
Pune .d in loc de .f si vezi ce se intampla.
Vezi cum e reprezentat "18785676818.f" in binar, si ce valoare e de fapt stocata https://www.h-schmid...er/IEEE754.html Si la https://www.binaryco...ert_double.html vezi ce e diferit la double. |
#6
Posted 25 January 2023 - 22:02
sags, on 25 ianuarie 2023 - 18:15, said:
Atat primul operand cat si rezultatul depasesc precizia de care este capabil tipul float. Adica nici primul operand nu poate fi reprezentat exact ci doar aproximativ, ceea ce deja introduce o eroare, nici rezultatul, acesta trebuind sa fie ‘rotunjit’ deci din nou o diferenta fata de valoarea exacta. Tipul float permite reprezentarea exacta a tuturor numerelor intregi de 7 cifre zecimale si a unei parti din cele de 8 cifre. Intervalul contiguu maxim de numere pozitive reprezentabile este 0…16777216, dincolo de aceasta valoare unii intregi sunt reprezentabili dar exista ‘gauri’, intregii din aceste ‘gauri’ fiind aproximati. Te cred, nu inteleg de ce limita este 3.40282e+38 ? De unde apare acel 16777216 ? Double pana la cat poate ajunge safe ca numar intreg? |
#7
Posted 25 January 2023 - 22:14
Nu exista numere intregi in float.
18785676818 e defapt 1.0934703350067139 * 234 care e defapt 18785677312 |
#8
Posted 25 January 2023 - 22:45
Tipul float poate reprezenta exact doar intregi care se pot scrie ca: un intreg in baza 2 de cel mult 24 de cifre binare inmultit cu o putere a lui doi. (Mai este si un interval limtat in care poate fi acea putere, dar pentru discutia de fata nu e important.)
Deci clar poti reprezenta intregii de cel mult 24 cifre binare, adica din intervalul 0…2^24-1 (16 777 215), punand exponentul 0. Ca sa obtii valori mai mari nu o mai poit face decat marind exponentul: treci la 1. Numai ca in acest moment obtii doar numere pare (ceva × 2^1), cele impare de aceasta marime nu sunt reprezentabile. Pe masura ce creste valoarea absoluta, esti nevoit sa treci la exponent 2, 3, etc, si deci reprezentabili in acele intervale de marime vor fi doar multiplii de 4 (2^2), apoi doar cei de 8 (2^3), samd. Poti reprezenta numere mari, si asa ajungi pe undeva pe la 1.0E+38 (tii minte ca am zis ceva si de limitare a exponentului?), dar nu toate/ consecutive si cu cat sunt mai mari cu atat cele reprezentabile exact sunt mai ‘rare’, cu ‘gauri’ tot mai mari intre ele. Pe double poti reprezenta toti intregii de maxim 15 cifre zecimale (si ceva din cei de 16, asta ca sa fie interval compact/ fara ‘gauri’). Mai mari de atat ca mai sus: pe masura ce valoarea absoluta creste, mai intai esti limitat la intregii pari, apoi la cei multiplu de 4, samd. Edited by sags, 25 January 2023 - 22:45. |
#9
Posted 25 January 2023 - 22:56
@sags
23 biti mantisa (cu valoare maxima 2^24-1, corect) 8 biti exponent 1 bit semn total 32 biti |
#10
Posted 26 January 2023 - 10:43
Da, mersi , rezolvat!
float a=0, b=0; while (true) { a++; if (a==b) { Debug("max float %f", b); break; } b=a; } Se opreste la 16777216 Edited by GabyF, 26 January 2023 - 10:43. |
|
#12
Posted 26 January 2023 - 11:27
GabyF, on 26 ianuarie 2023 - 10:43, said: Da, mersi , rezolvat! … Algoritmul tau depinde foarte mult de regula folosita pentru ‘rotunjire’. Numarul 16777217 nu este reprezentabil si rezultatul lui 16777216+1 trebuie ‘rotunjit’. Candidatii sunt numerele reprezentabile cele mai apropiate de rezultatul ideal, adica 16777216 si 16777218. Pe care il alegi?
GabyF, on 26 ianuarie 2023 - 11:15, said: Deci care e maximul double ? … Acu’ ca sa fim pedanti exista si intregi mai mari reprezentabili, dar nu un interval compact. Un interval contiguu care porneste de la 0 se opreste insa la aceasta valoare. Mai sus nu ai doua numere intregi consecutive care sa fie ambele reprezentabile. Edited by sags, 26 January 2023 - 11:18. |
#13
Posted 26 January 2023 - 11:38
https://en.wikipedia.org/wiki/IEEE_754
https://en.wikipedia...ng-point_format https://en.wikipedia...ng-point_format GabyF, on 26 ianuarie 2023 - 11:15, said:
Deci care e maximul double ? tu practic vrei sa stii care este cea mai mare valoare intreaga pe care o poti scrie pe un double, fara abatere (epsilon 0). Edited by MarianG, 26 January 2023 - 11:43. |
#14
Posted 26 January 2023 - 11:45
LE: Problema de a obtine caracteriticile reprezentarii in virgula mobila ale unui calculator ruland un programel pe acel calculator nu e tocmai banala, ca orice calcul e limitat exact de acele caracteristici. Aici sunt referinte la 2 articole pe acest subiect:
MarianG, on 26 ianuarie 2023 - 11:38, said: … cea mai mare valoare intreaga pe care o poti scrie pe un double, fara abatere … |
#15
Posted 26 January 2023 - 11:58
https://www.amazon.c...r/dp/3319765256
sags, on 26 ianuarie 2023 - 11:45, said:
Tin minte ca i-am si modificat pentru ca nu se comporta OK, si nu detecteaza, cand modul de rotunjire este ‘round to even’ cum e la procesoarele Intel (cel putin; nu stiu pe dinafara daca acesta e doar modul de rotunjire implicit si poate fi ales altul, sau e ‘batut in cuie’ dpdv hardware). sags, on 26 ianuarie 2023 - 11:45, said:
Eu as formula asa: cel mai mare intreg n pentru care toate numerele intregi din intervalul 0…n sunt reprezentabile (fara aproximare). Utilitatea: atata timp cat nu depasesti aceasta valoare stii sigur ca nu vei avea erori de rotunjire indiferent ce calcule faci. poate ca da, dar maximul nu implica apartenenta la un set ordonat de valori Edited by MarianG, 26 January 2023 - 11:59. |
|
#16
Posted 26 January 2023 - 12:13
MarianG, on 26 ianuarie 2023 - 11:58, said:
poate ca da, dar maximul nu implica apartenenta la un set ordonat de valori Da, asa e, n-am specificat dar e codul care e sinonim. Cum poate fi marit acest maxim, "ordonat" daca vreti ? E ok asa? double a, b; int x; // maxim 254 !? x=10; a=b*(9.9^x)/(10.^x); Am mai deschis un topic legat de acesta cu exemplu unde vreau sa folosesc numere foarte mari. Edited by GabyF, 26 January 2023 - 12:22. |
#17
Posted 26 January 2023 - 12:20
Un pas (sau mai multi inapoi): ce problema vrei sa rezolvi folosind float?
|
#18
Posted 26 January 2023 - 12:27
https://en.cpprefere.../c/types/limits
FLT_MAX 340282346638528859811704183484516925440 01111111111111111111111111111111 01111111011111111111111111111111 practic este +infint-1 dani.user, on 26 ianuarie 2023 - 12:20, said:
Un pas (sau mai multi inapoi): ce problema vrei sa rezolvi folosind float? |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users