Подтвердить что ты не робот

Параметры оптимизации g++ влияют на значение функции sin

У меня проблема с функцией "sin" libc.

#include <cmath>
#include <stdio.h>

int main(int argc, char **argv)
{
    double tt = 6.28318530717958620000; // 2 * M_PI
    double yy = ::sin(tt);

    printf("%.32f\n", yy);

    return 0;
}

При компиляции вышеуказанного кода с использованием "g++" без какой-либо опции оптимизации он выводит "-0.00000000000000024492127076447545". Но если с опцией "-O3" она выдаст "-0.00000000000000024492935982947064".

Почему он не возвращает "-0.00000000000000024492935982947064" без "-O3"? Спасибо заранее.

4b9b3361

Ответ 1

Потому что с "-O3" компилятор предварительно вычисляет sin(2*pi) во время компиляции с одним алгоритмом. Без "-O3" это вычисляется во время выполнения с другим алгоритмом.

Это может быть связано с тем, что сам компилятор был построен с некоторой математической библиотекой, которая отличается от вашей математической библиотеки.

Обновление

Единственный объект, дающий результат "-0.00000000000000024492127076447545" - это 32-разрядная версия libstdС++. 64-битная версия той же библиотеки, а также gcc сама производит "-0.00000000000000024492935982947064".

Поэтому обновление до более новой версии не поможет. Кроме того, я пробовал различные варианты, предлагаемые здесь: ни -ffloat-store, ни -fno-builtin не имеют никакого значения, а также длинный double и sinl.

32-разрядный libstdС++ использует 387 инструкций с плавающей запятой, а gcc явно использует инструкции SSE. Вот в чем разница. Вероятно, единственный способ сделать их последовательными - перестроить gcc из источников, направляя его на использование только 387 инструкций внутри.