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