Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Ce farmacie VET online care "...

De unde cumparați legume si fructe?

Samsung S21 ultra

Plasa de umbrire peste gard de pl...
 O smecherie pe care nu o inteleg

Balcon parter fara acte

unde gasesc un speed bag in bucur...

Programe TV cu altfel de sporturi
 Laptop "bun la toate" max...

navigatie noua vw tiguan

ctfmon.exe - System Error (in Saf...

Ați prins vremurile cand 120 Volț...
 Whatsapp nu afișeaza numele ...

Medii admitere Politehnica Bucure...

Se extinde Baza de la Kogalniceanu

Politist mutilat de caine in curt...
 

Impartire gresita in float

- - - - -
  • Please log in to reply
18 replies to this topic

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
De ce impartirea aceasta in float da rezultat gresit? Nu depaseste maximul float.


sprintf(res,"float= %f",18785676818.f/15.f);



#2
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,815
  • Înscris: 24.04.2013
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,815
  • Înscris: 24.04.2013
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
blitz09

blitz09

    Member

  • Grup: Members
  • Posts: 425
  • Înscris: 05.11.2007
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
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006

View Postsags, 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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
Nu exista numere intregi in float.

18785676818 e defapt 1.0934703350067139 * 234 care e defapt 18785677312

#8
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,815
  • Înscris: 24.04.2013
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
@sags
23 biti mantisa (cu valoare maxima 2^24-1, corect)
8 biti exponent
1 bit semn
total 32 biti

#10
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
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.


#11
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
Deci care e maximul double ?

2^53 = 9007199254750000

#12
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,815
  • Înscris: 24.04.2013

View PostGabyF, on 26 ianuarie 2023 - 10:43, said:

Da, mersi , rezolvat! …
Hm. Daca vroiai intervalul compact maxim de numere intregi reprezentabile nu prea ai rezolvat, ci doar s-a nimerit.

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?
  • Procesoarele Intel folosesc regula ‘round to even’: il aleg pe cel ‘par’, adica avand un 0 in bitul cel mai putin semnificativ al reprezentarii(*), de aceea rotunjeste la 16777216.
  • O regula comuna este insa de rotunjire la cel mai apropiat iar daca ambele sunt la fel de apropiate se alege cel mai mare deci 16777218 la a++ din programel. Daca s-ar aplica aceasta regula de rotunjire algoritmul tau nu s-ar mai opri cand trebuie.
(*) Logica acestei decizii este ca reprezentarea lui avand nevoie de un bit mai putin (0 din coada poate fi omis fara a altera valoarea) este ‘mai putin supus greseliiPosted Image rotunjirii’ cand urmeaza a fi folosit in continuare in alte calcule.

View PostGabyF, on 26 ianuarie 2023 - 11:15, said:

Deci care e maximul double ? …
253 = 9 007 199 254 740 992.

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
https://en.wikipedia.org/wiki/IEEE_754

https://en.wikipedia...ng-point_format

https://en.wikipedia...ng-point_format

View PostGabyF, on 26 ianuarie 2023 - 11:15, said:

Deci care e maximul double ?
+infint
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,815
  • Înscris: 24.04.2013
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: Sunt articole foarte vechi si de atunci o mai fi curs ceva cerneala pe aceasta tema. Aveam pe undeva acei algoritmi, dar nu mai stiu pe unde. 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).

View PostMarianG, on 26 ianuarie 2023 - 11:38, said:

… cea mai mare valoare intreaga pe care o poti scrie pe un double, fara abatere …
Eu as formula asa: cel mai mare intreg n pentru care toate numerele intregi din intervalul 0n 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.

#15
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
https://www.amazon.c...r/dp/3319765256

View Postsags, 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).

https://cplusplus.co...env/fesetround/

View Postsags, on 26 ianuarie 2023 - 11:45, said:

Eu as formula asa: cel mai mare intreg n pentru care toate numerele intregi din intervalul 0n 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
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006

View PostMarianG, 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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
Un pas (sau mai multi inapoi): ce problema vrei sa rezolvi folosind float?

#18
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,360
  • Înscris: 10.08.2005
https://en.cpprefere.../c/types/limits
FLT_MAX 340282346638528859811704183484516925440

01111111111111111111111111111111
01111111011111111111111111111111
practic este +infint-1

View Postdani.user, on 26 ianuarie 2023 - 12:20, said:

Un pas (sau mai multi inapoi): ce problema vrei sa rezolvi folosind float?
de fapt, de ce explicit float si nu double ?

Anunturi

Neurochirurgie minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate