Компилятор далеко впереди вас.В вашем примере:
float a = 1 / sqrtf(2 * M_PI);
float b = c / sqrtf(2 * M_PI);
nvopencc (Open64) выдаст это:
mov.f32 %f2, 0f40206c99; // 2.50663
div.full.f32 %f3, %f1, %f2;
mov.f32 %f4, 0f3ecc422a; // 0.398942
, что эквивалентно
float b = c / 2.50663f;
float a = 0.398942f;
Второй случайскомпилировано в это:
float a = 1 / sqrtf(c * 3.14159f); // 0f40490fdb
float b = c / 1.77245f; // 0f3fe2dfc5
Я предполагаю, что выражение для a
, сгенерированное компилятором, должно быть более точным, чем ваша "optmized" версия, но примерно с той же скоростью.