-ffast-math
робить набагато більше, ніж просто порушувати суворе дотримання IEEE.
Перш за все, звичайно, це зламається чітке дотримання IEEE, дозволяючи, наприклад, переупорядкувати інструкції на те, що математично те саме (в ідеалі), але не зовсім однакове в плаваючій точці.
По-друге, це вимикає налаштування errno
після математичних функцій з однією інструкцією, що означає уникнення запису в локальну змінну потоку (це може зробити 100% різницю для цих функцій у деяких архітектурах).
По-третє, це робить припущення, що вся математика є кінцевою , а це означає, що ніяких перевірок на NaN (або нуль) не робиться там, де вони мали б згубний вплив. Просто припускається, що цього не відбудеться.
По-четверте, це дозволяє зворотні наближення для ділення та зворотного квадратного кореня.
Крім того, він відключає підписаний нуль (код припускає, що підписаний нуль не існує, навіть якщо ціль його підтримує) та математику округлення, що дозволяє, крім усього іншого, постійне згортання під час компіляції.
Нарешті, він генерує код, який передбачає, що жодне апаратне переривання не може відбутися через математичну сигналізацію / захоплення (тобто якщо їх не можна вимкнути в цільовій архітектурі і, отже, це не станеться , вони не будуть оброблятися).