OT Ceckarsky kviz

Jan Waclawek konfera na efton.sk
Středa Leden 26 18:04:21 CET 2022


Lebo to nie je len tak mirnix-dirnix exponent.

Funguje len tak, ze
- na zaciatku MUSI byt 0x alebo 0X (t.j. hexadecimalny prefix)
- potom hexadecimalne cislo
- potom MUSI byt bodka
- potom MOZU byt dalsie hexadecimalne znaky
--- potialto je to mantisa (*)
- potom MUSI byt p alebo P
- potom nasleduje binarny exponent v desiatkovom tvare s volitelnym
znamienkom (**)
- potom MOZE byt f alebo F (pre float) alebo l alebo L (pre double) ako u
"normalnej" konstanty s pohyblivou radovou ciarkou

Z tychto pravidiel je jasne, ze preco Ti ani jeden z tych pokusov nevysiel
- v prvom chyba prefix 0x, v druhom chyba bodka pred P (co mimochodom ten
kompilator aj napisal, aj ked nechapem preco zmenil velkost toho p, ale
nemusim chapat vsetko).

Ten moj priklad bol 0x1C2D.3EP4F - rozoberme si ho:

(*) Mantisa je hexadecimalna zlomkova t.j. N cifier za bodkou znamena ze sa
to cislo za bodkou vydeli 16^N a pricita k cislu pred bodkou. Tu je cela
cast 0x1C2D, t.j. desiatkovo 7213. Zlomkova cast je 0x3E (ano, naschval
som vybral take aby tam bolo to E, aby to vyzeralo ako to co sa pouziva
pri desiatkovej floating-point konstante - ono je to P presne kvoli tomu,
lebo E sa neda pouzit), t.j. 62/16^2=0.2421875. Takze mantisa je
7213.2421875.

(**) Exponent je tu 4 (to F na konci je znova na zmatenie nepriatela -
exponent je *desiatkovy* a moze byt pred nim znamienko; to F je float
suffix), je to binarny exponent, t.j. mantisu vynasibime 2^exponent,
7213.2421875*2^4=115411.875

Tiez som na to prisiel uplne nahodou, skumanim normy C99 (6.4.4.2) :-)

Vyhoda (ano, ja viem, malokto takuto vyhodu oceni) tohoto formatu je, ze ak
sa nenapise privela cifier v mantise, tak ta floating-point reprezentacia
je presna (co u desiatkoveho zapisu je skor vynimka). Dokonca norma v
odstavci 6 odkazovanej kapitoly doporucuje, aby v pripade, ze pre takuto
konstantu nastane zaokruhlenie (t.j. ked sa napise privela cifier),
prekladac vypisal warning.

wek


----- Original Message ---------------

>Mne napr. Visual Studio 2005 ani 2013 nezoberu 'P' ako exponent. Oba
>tieto jednoduche riadky hodia chybu
>
>double d1 = 1p2;
>double d2 = 0x1P2;
>
>error C2059: syntax error : 'bad suffix on number'
>error C2146: syntax error : missing ';' before identifier 'p2'
>
>miro
>
>st 26. 1. 2022 o 16:43 Jindroush <jindroush na seznam.cz> napísal(a):
>>
>> No, pote, co jsem odeslal moje 'reseni', zkusil jsem to na godboltu a
>> netrefil jsem jediny compiler, co by to nevzal. To jste zkousel na cem?
>> J.
>>
>> On 26.01.2022 16:12, Jiří Nesvačil wrote:
>> > Lexer zahlasi chybu. Neboli kompilace na urovni prebirani tokenu,
>> > slov, zjisti, ze se jedna o nepreveditelne slovo. Mozna nejaky pra
>> > kompiler to zvladne, ale obecne NE.
>> >
>> > Dne 26.01.2022 v 16:00 Jan Waclawek napsal(a):
>> >> Bez toho aby ste skusili kompilovat, uhadnite, co vypise toto:
>> >>
>> >>    printf("%f", 0x1C2D.3EP4F);
>>
>> --
>> Jindroush <jindroush na seznam.cz>



Další informace o konferenci Hw-list