У меня есть приложение, которое было разработано для Linux x86 32 бит. Есть много операций с плавающей точкой и множество тестов в зависимости от результатов. Сейчас мы портируем его на x86_64, но результаты теста в этой архитектуре разные. Мы не хотим хранить отдельный набор результатов для каждой архитектуры.
Согласно статье Введение в GCC - для компиляторов GNU gcc и g ++ проблема состоит в том, что GCC в X86_64 предполагает fpmath = sse , а x86 предполагает fpmath = 387 . FPU 387 использует 80-битную внутреннюю точность для всех операций и преобразует результат только в заданный тип с плавающей точкой (float, double или long double), в то время как SSE использует тип операндов для определения его внутренней точности .
Я могу force -mfpmath = 387 при компиляции собственного кода, и все мои операции работают правильно, но всякий раз, когда я вызываю какую-либо библиотечную функцию (sin, cos, atan2 и т. Д.), Результаты снова оказываются неверными , Я предполагаю, что это потому, что libm был скомпилирован без переопределения fpmath.
Я пытался собрать libm самостоятельно (glibc), используя эмуляцию 387, но это вызвало множество сбоев (не знаю, сделал ли я что-то не так).
Есть ли способ заставить весь код в процессе использовать эмуляцию 387 в x86_64? Или, может быть, какая-то библиотека, которая возвращает те же значения, что и libm на обеих архитектурах? Есть предложения?
Относительно вопроса «Вам нужна точность 80 бит», я должен сказать, что это не проблема для отдельной операции. В этом простом случае разница действительно мала и не имеет значения. Однако при объединении большого количества операций ошибка распространяется, и разница в конечном результате уже не так мала и имеет значение. Поэтому я думаю, что мне нужна точность 80 бит.