C - Hex-Bezeichnung mit "p"

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

C - Hex-Bezeichnung mit "p"

Beitrag von Mathias »

Ich habe im folgendem Code-Schnipsel ein p in 0x... gefunden.
Weis einer was dies bedeutet ?

Code: Alles auswählen

float ax = fabsf (x);

  if (ax < 0.5f)
    return 0;

  if (ax < 0x1p+23f)
    {
      /* Test whether an integer to avoid spurious "inexact".  */
      float t = ax + 0x1p+23f;
      t = t - 0x1p+23f;
      if (ax != t)
Bis jetzt meinte ich immer Hex-Zahlen fangen mit 0x an und dann kommt 0..9,A..F .
Aber was bedeutet das "p" ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: C - Hex-Bezeichnung mit "p"

Beitrag von theo »

Heisst wohl "power" (exponent) also 2 hoch irgendwas.

https://www.gnu.org/software/c-intro-an ... tants.html

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C - Hex-Bezeichnung mit "p"

Beitrag von Mathias »

Heisst wohl "power" (exponent) also 2 hoch irgendwas.

https://www.gnu.org/software/c-intro-an ... tants.html
Dies kann ich noch nachvollziehen mit dem - oder + wird ein shl oder shr ausgeführt.

Code: Alles auswählen

0x100p-8 // 1 
0x10p-4 // 1 
0x1p+4 // 16 
0x1p+8 // 256
Aber dies kann ich nicht nachvollziehen.

Code: Alles auswählen

0xAp2 // 40 in Dezimalzahl 
0xAp-1 // 5 in Dezimalzahl 
0x2.0Bp4 // 32,6875 in Dezimalzahl 
0xE.2p3 // 113 in Dezimalzahl 
0x123.ABCp0 // 291,6708984375 in Dezimalzahl 
0x123.ABCp4 // 4666,734375 in Dezimalzahl 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: C - Hex-Bezeichnung mit "p"

Beitrag von wp_xyz »

Mathias hat geschrieben:
Mi 20. Dez 2023, 19:29

Code: Alles auswählen

0xAp2 // 40 in Dezimalzahl 
0xA = 10, p2 = 2^2 = 4, also 10*4 = 40
Mathias hat geschrieben:
Mi 20. Dez 2023, 19:29

Code: Alles auswählen

0xAp-1 // 5 in Dezimalzahl 
0xA = 10, p-1 = 2^-1 = 1/2, also 10/2 = 4
Mathias hat geschrieben:
Mi 20. Dez 2023, 19:29

Code: Alles auswählen

0x2.0Bp4 // 32,6875 in Dezimalzahl 
Hex-Bruchzahl 0x2.0B = 2*16^0 + 0*16^-1 + 11*16^-2 = 2 + 11/(16*16)
Exponent p4 = 2^4 = 16
Insgesamt: (2 + 11/(16*16)) * 16 = 32 + 11/16 = 32.6875
Mathias hat geschrieben:
Mi 20. Dez 2023, 19:29

Code: Alles auswählen

0xE.2p3 // 113 in Dezimalzahl 
Hex-Bruchzahl 0xE.2 = 14*16^0 + 2*16^-1 = 14 + 2/16
Exponent p3 = 2^3 = 8
Insgesamt: (14 + 2/16) * 8 = 112 + 1 = 113

usw...

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C - Hex-Bezeichnung mit "p"

Beitrag von Mathias »

Danke für die Info.
Sieht mir stark nach Algebra aus.
Dies scheint wieder mal ein gutes Beispiel zu sein, wie schlecht man mit C coden kann.
Unleserlicher geht es kaum noch.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: C - Hex-Bezeichnung mit "p"

Beitrag von wp_xyz »

Mathias hat geschrieben:
Do 21. Dez 2023, 14:11
Danke für die Info.
Sieht mir stark nach Algebra aus.
Dies scheint wieder mal ein gutes Beispiel zu sein, wie schlecht man mit C coden kann.
Unleserlicher geht es kaum noch.
Weiß nicht, ich denke, das kannst du C nicht anlasten. In Pascal ist es nicht anders (nur dass es da nicht möglich ist, Brüche in Hex-Notation darzustellen). Es ist halt, dass das Hexadezimalsystem für uns nicht direkt eingängig ist. Aber eigentlich ist es wie im Dezimalsystem, nur dass die Zahlen mit Faktoren 16^n versehen werden statt mit 10^n, und dass es zusätzlich zu 0..9 auch Ziffern A..F gibt

Code: Alles auswählen

Beispiel:
Dezimalzahl       125 = 1*100 + 2*10 + 5*1 = 1*10^2 + 2*10^1 + 5*10^0
Hexadezimalzahl 0x125 = 1*256 + 2*16 + 5*1 = 1*16^2 + 2*16^1 + 5*16^0
Und bei Bruchzahlen ist es genauso, nur dass die Exponenten negativ sind:

Code: Alles auswählen

Beispiel:
Dezimalbruch      1.25 = 1*1 + 2/10 + 5/100     = 1*10^0 + 2*10^-1 + 5*10^-2
Hexadezimalbruch 0x1.25 = 1*1 + 2/16 + 5/(16*16) = 1*16^0 + 2*16^-1 + 5*16^-2 

Antworten