Scopul valorii hexazecimale în virgulă mobilă? (Programare, Virgulă Mobilă, Hexagonal)

Brian a intrebat.
a intrebat.

Tot ce am găsit după căutări a fost cum să le folosesc. Sunt foarte curios să aflu de ce. Care sunt avantajele utilizării unei valori în virgulă mobilă în format hexazecimal?

Editare pentru clarificare:

Studiez pentru a obține certificatul Zend PHP Engineer. Într-unul dintre testele practice, se postează o bucată de cod cu câteva variabile setate, face niște calcule de bază, apoi întreabă care este rezultatul. Una dintre variabilele setate este „0xFF”. Care, din câte am înțeles, reprezintă 255.0 ca valoare în virgulă mobilă.

Așadar, întrebarea mea este: când este acest lucru

0xfed01

este mai utilă decât aceasta

1043713

Comentarii

  • La ce vă referiți? O valoare în virgulă mobilă este doar o serie de biți, la fel ca orice altă valoare dintr-un calculator. Ce încercați să faceți? –  > Por Emil Vikström.
  • Când spuneți că 0xFF reprezintă 255.0, , probabil că este implicată o conversie: este numărul întreg 0xFF convertit în float. 0xFF nu este reprezentarea lui 255,0 pentru niciun format comun. C99 are o convenție hexadecimală lizibilă pentru oameni pentru tipărirea și analiza numerelor în virgulă mobilă, dar ar trebui să arate astfel 0xFF.0p0 pentru a fi în acel format (iar acest format, după știința mea, a ajuns până acum doar în Java). Pe scurt, sunteți sigur că 0xFF nu este de fapt un număr întreg (convertit ulterior în float) și că întrebarea dumneavoastră nu este „Scopul valorii întregi hexadecimale?”?”? –  > Por Pascal Cuoq.
  • @PascalCuoq: (… a ajuns doar în Java). Și în Python, de asemenea! Nu ca literali, dar Python are float.hex și float.fromhex metode, astfel încât, de ex, 2.3.hex()'0x1.2666666666666p+1'. –  > Por Mark Dickinson.
1 răspunsuri
Eric Postpischil

C are constante hexazecimale în virgulă mobilă, cu o formă care începe cu „0x”, apoi cifre hexazecimale, incluzând opțional un punct radix, apoi un „p”, apoi un exponent semnat în zecimal, care este o putere de doi. De exemplu, 0x1.fp-2 este (1 + 15/16)-2.-2 = .484375. (Aceste constante sunt double fără sufix, float cu un f sau F sufix, și long double cu un l sau L sufix).

Constantele hexadecimale cu virgulă mobilă permit compilatorului să reproducă cu ușurință valoarea exactă.

În cazul constantelor zecimale, există o anumită dificultate în convertirea unui număr zecimal în virgulă mobilă binară. Acest lucru se datorează faptului că unele valori pot fi foarte apropiate de un punct în care o valoare este rotunjită în sus sau în jos, în funcție de cifrele din urmă. Și poate fi dificil să se facă aritmetica pentru acest lucru, deoarece aritmetica numerică este supusă erorilor de rotunjire. Încercarea de a evita erorile de rotunjire în timp ce se calculează valori precise care implică cifre dincolo de cele reprezentate în mod normal de formatul cu virgulă mobilă necesită o inginerie atentă.

Aceasta este o problemă rezolvată (Conversii binar-decimal și zecimal-binar rotunjite corect de David M. Gay, 1990). Cu toate acestea, unele compilatoare nu au implementat-o corespunzător. Este mai ușor pentru programatori să scrie cod pentru a converti virgulă mobilă hexazecimală, deoarece se potrivește frumos cu formatul binar: Puteți spune cu ușurință dacă un număr este peste sau sub un punct de rotunjire examinând câteva cifre individuale; nu este nevoie de o aritmetică implicată care agravează erorile de rotunjire.

În mod obișnuit, un inginer de software care este preocupat de precizia virgulă mobilă ar pregăti constantele hexazecimale în virgulă mobilă pentru a le utiliza într-un program, generându-le cu un software special (de exemplu, Maple sau Mathematica sau propriul software personalizat specific sarcinii sau o combinație).

De asemenea, este posibil să se creeze o constantă în virgulă mobilă prin specificarea reprezentării sale interne, cum ar fi crearea unei uniuni a unui întreg fără semn și a unui obiect în virgulă mobilă și inițializarea uniunii cu o valoare hexazecimală pentru întreg. Acest lucru necesită cunoașterea formatului de codificare a valorii în virgulă mobilă. Acest lucru ar trebui să se facă rareori. De obicei, este utilă doar în scopuri speciale, cum ar fi pregătirea NaNs cu sarcini utile și lucrul în software care efectuează operații specializate în virgulă mobilă.

Comentarii

  • Mulțumesc foarte mult, deci este pentru comparații precise în virgulă mobilă. –  > Por Brian.
  • Specificația Java (versiunea 13) este puțin neclară cu privire la faptul că literalele hexazecimale în virgulă mobilă sunt IEEE 754 pe 32 de biți cu precizie unică sau pe 64 de biți cu precizie dublă. Știți cumva? –  > Por Urhixidur.
  • Literalii în virgulă mobilă hexadecimală sunt în mod implicit de precizie dublă și pot fi „forțați” la precizie unică prin sufixul f sau F, la fel ca și literalii în virgulă mobilă zecimală. (ref: dzone.com/articles/java-hexadecimal-floating-point-literal) –  > Por Urhixidur.