Z té knížky bych vybral jen jeden příklad, aby bylo vidět, jak dokáže být C záludné:
float uradnik(float r)
{
float s;
s = 3.1415926 * r * r;
return( s );
}
Většina lidí si myslí, že se to bude počítat jako float, ale není to tak. 3.1415926 je totiž datový typ double, takže všechny argumenty toho výrazu (r) se převedou na double, výpočet se provede v double a nakonec se výsledek opět převede na float. Konverze float <-> double jsou hodně drahé, takže ve výsledku to bude mnohem pomalejší, než kdyby bylo všechno v double. Správný zápis té konstanty má být 3.1415926f.
gcc pro 3.1415926 vygeneruje tenhle kód:
uradnik:
.LFB11:
.cfi_startproc
unpcklps %xmm0, %xmm0
cvtps2pd %xmm0, %xmm1
movsd .LC0(%rip), %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
unpcklpd %xmm0, %xmm0
cvtpd2ps %xmm0, %xmm0
ret
a pro 3.1415926f:
uradnik:
.LFB11:
.cfi_startproc
movaps %xmm0, %xmm1
movss .LC0(%rip), %xmm0
mulss %xmm1, %xmm0
mulss %xmm1, %xmm0
ret