- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 
                        Флоат даёт ошибки только тогда, когда он плывёт. 
На вычислении всяких косинусов он не плывёт - поэтому ошибки там врядли возможны.
Точность не будет падать - её не будет, вместо неё будет округленчиский мусор.
Каким образом у вас это получилось - я не знаю, ибо у меня cos(M_PI_2) = ноль. 2.0f*2.0f = 4.0.
Конпелятор всегда знает, ибо нормальные про-пацаны юзают фичи конпелятора, и умеют писать код. 
В гцц есть такие штуки - builtin_*() - ими запиленны аналоги самых популярных libc функций. 
ГГЦ абсалютно точно умеет определять константы - для этого есть свой builtin_constant_p() - 
который в любом куске кода тебе 100% скажет - константа эта перменная, либо нет.
Дак вот, в гцц даже можно писать так:
  static const double cos_pi = cos(M_PI);//глобальная статик-константа, которая в компилтайме инициализируется результатом вызова функции cos(). Это не особо профитно, ибо издревли система констант в Си лютое говно.
Так же в гцц есть атрибуты, один из которых const - он говорит, что твоя функция не имеет побочных эффектов. 
И все функции, которые их не имеют - принято так помечать, особенно в glibc и libgcc.
А всё почему? Патамучто их пишут более-менее про-пацаны. 
Конпелятору не нужно ничего знать - знает программист, который пишет, а конпелятор должен предоставить ему фичи, 
с которыми он может пилить нормальный код, а не говно. 
А неосиляторам подавай оптимизиторы, автоматизаторы и прочую ересь, от которой толка нет, а гонору много.