OT Ceckarsky kviz

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


>Inac ja som ten vyraz pochopil a rucne som ho (za pouzitia kalkulacky)
>vyratal este pred pokusmi s kompilatorom: 115417.92

Fiha, takze Ty si to poznal? Ale preco sa cudujem... :-)

Hento je ocividne nasledok snahy ne-C99 kompilatora to rozparsovat - 'bad
suffix on number' je bodka za 0x1; missing ';' before 'constant' je to ze
.1 pochopil ako dalsiu konstantu; tie dalsie dve su samovysvetlujuce.

Ten moj povodny je asi tak, ze to rozbil na 0x1C2D a .3E za ktorym mu chyba
exponent, a az potom mu vadi ta bodka za tym 0x1C2D, a asi aj chape ze
printf("%f") ma mat presne jeden dalsi parameter, inak by nefrflal tolko s
tou zatvorkou.

Ale mozem sa aj mylit. Tazko povedat, co to presne sposobilo. C ako jazyk
je taky nenormalny bordel, ze napisat parser je netrivialne (citaj:
obrovske) usilie. Popritom usili sa snazia ti, co tie prekladace robia aj
o to, aby tie errory aspon pre bezne chyby co ludia robia, davali aspon
aky-taky zmysel (a mnohe prekladace sa snazia z parsovacich chyb spamatat
a prelozit aj zvysok), ale vysledkom je, ze tie hlasky su castokrat matuce.

wek



----- Original Message ---------------
>OK, tie pravidla, co musi byt, som si nepamatal. Kazdopadne najprv to
>neskompilovalo ani Tvoj originalny priklad. Az nasledne som vyraz
>zjednodusoval. Toto je uz dufam ok:
>
>double d2 = 0x1.1P2;
>
> error C2059: syntax error : 'bad suffix on number'
> error C2143: syntax error : missing ';' before 'constant'
> error C2146: syntax error : missing ';' before identifier 'P2'
> error C2065: 'P2' : undeclared identifier
>
>Original:
>
>printf("%f", 0x1C2D.3EP4F);
>
>error C2021: expected exponent value, not 'P'
>error C2059: syntax error : 'bad suffix on number'
>error C2143: syntax error : missing ')' before 'constant'
>error C2059: syntax error : ')'
>
>Inac ja som ten vyraz pochopil a rucne som ho (za pouzitia kalkulacky)
>vyratal este pred pokusmi s kompilatorom: 115417.92
>Aj mail som mal rozpisany, ale reku mozno je to chytak, ani kompilovat
>to nejde..  A potom tu boli narazky na kompilatory, tak som to nechal
>tak a zareagoval len na ten kompilator.
>
>miro
>
>st 26. 1. 2022 o 18:04 Jan Waclawek <konfera na efton.sk> napísal(a):
>>
>> 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


Další informace o konferenci Hw-list