Я написал многомерный код числовой интеграции, который может работать с двойной, длинной двойной или четырехкратной точностью в Linux. Все режимы компилируются и работают безупречно, но когда я пытаюсь скомпилировать один и тот же код для случая с четверной точностью на Mac, я получаю ошибки, в которых я не уверен, что они означают.
Я компилирую в g ++, но я пробовал другие компиляторы (я пробовал clang только для того, чтобы посмотреть, что он будет делать, но, насколько мне известно, он не может поддерживать четырехкратную точность? Поправьте меня, если я не прав).
Я связываю соответствующие библиотеки и заголовки (включая заголовок quadmath.h) и получаю следующие ошибки из quadmath.h:
Unsupported machine mode 'TC'
typedef _Complex float __attribute__((mode(TC))) __complex128
error unknown type name '__float128'
Ошибки __float128 также появляются для различных математических операций, таких как acosq, asinq и т. Д.
Я никогда раньше не сталкивался с ошибкой режима Unsupported machine. Я посмотрел на заметки компилятора GNU Примечания компилятора GNU а также GNU плавающие типы.
Было бы сложно создать минимальный рабочий пример для людей, чтобы компилировать и тестировать, поэтому я просто пытаюсь отследить ошибки, чтобы выяснить, что не так, но я не уверен, что делать на этом этапе. Каким будет следующий шаг с учетом этих сообщений об ошибках? Что-то мне не хватает в отношении Linux против Mac? Я всегда программировал в Linux, поэтому не знаком с последним, и кажется, что есть другой способ приблизиться к вычислениям с четверной точностью на Mac, чем я привык.
Спасибо за помощь
-Йети
Различные архитектуры (типы процессоров / операционные системы) не всегда поддерживают одни и те же типы с плавающей запятой. Судя по сообщению об ошибке в вашем вопросе, «__float128» не поддерживается на Mac, на котором вы пытаетесь скомпилировать код.
Есть два разных способа исправить это, что я хотел бы рассмотреть. Самым простым является добавление директив препроцессора в ваш код, чтобы убедиться, что скомпилированы только определенные части кода; а именно те, для которых типы с плавающей запятой поддерживаются в целевой архитектуре. К сожалению, это будет означать, что версия вашей программы для Mac не сможет использовать четырехкратную точность.
Более сложное решение — реализовать тип с плавающей запятой четверной точности самостоятельно или найти библиотеку, в которой он уже реализован. Я думаю, что эти пользовательские типы не будут такими же быстрыми, как изначально поддерживаемые типы, но, по крайней мере, вы сможете получить желаемую точность.
Других решений пока нет …