Проблемы с четвёртой точностью кода на Фортране, скомпилированного с 64-битным анакондом
Я использовал f2py, чтобы "питонизировать" некоторые коды Fortran для использования на 64-битной машине с Windows 7. Я работаю с 64-битной Anaconda 4.2.0 и использую MinGW, установленный через conda install mingw
(связанные папки используют имя "x86_64-w64-mingw32"). Это работало хорошо, пока я не попробовал программу с числами четвертой точности (REAL*16). Я обнаружил, что программа аварийно завершилась (libquadmath-0.dll была указана в поле "Проблема" в отчете о сбое, созданном Windows).
Я попытался определить простейший случай, который вызывает проблему. Я закончил тем, что придумал довольно простую программу на Фортране, которая дает "фатальную ошибку" при определенных условиях:
ПРОГРАММА ГЛАВНАЯ REAL*8 DL REAL*16 QL DL=2,71828 QL=3,14159 C при компиляции с -ffpe-trap= переполнением с дистрибутивом MinGW для 64-битной Anaconda, раскомментирование любой из приведенных ниже строк прерывает работу программы ("фатальная ошибка" во время выполнения) C, однако, вторая строка является приемлемой, если DL изменяется на четверную точность (REAL*16) C обе строки приемлемы, если оба значения DL и QL имеют двойную точность (REAL*8) ОТКРЫТО (79) печать *, "DL=",DL print*, "Ready to print QL!" print*, "QL=",QL конец
Как указано в комментариях выше, когда я компилирую с помощью gfortran пакета Anaconda MinGW с опцией компилятора -ffpe-trap=overflow
Я получаю фатальную ошибку. Например, с обеими строками без комментариев (как выше) я получаю:
DL = 2.7182800769805908 Готовы к печати QL! Произошла фатальная ошибка! Обратный след для этой ошибки: # 0 ffffffffffffffff
(См. Комментарии в коде для получения дополнительной информации о том, что происходит с различными вариантами.)
Я пробовал со стандартным дистрибутивом MinGW32, который я установил на том же компьютере (компилирование и запуск в командной строке msys), и никаких проблем нет.
Я полагаю, что я подтвердил, что libquadmath-0.dll, включенный в пакет anaconda mingw, является 64-битной DLL. У меня не было возможности выявить какие-либо проблемы с переменными среды, и я думаю, что исключил возможность использования моей стандартной 32-битной DLL MinGW32 путем временного переименования каталога MinGW32.
Помимо 32-битной и 64-битной разницы, я заметил, что мой MinGW32 gfortran основан на GCC 4.8.1, тогда как gfortran с 64-битным пакетом Anaconda MinGW указан как использующий GCC "4.7.0 20111220 (экспериментальный)". Я не уверен, связано ли это с проблемой, но я не смог найти ничего очевидного в журнале изменений GCC, который бы объяснил проблемы, которые я вижу.
Я был бы очень признателен за любые советы / решения, которые может дать каждый.
Мне было бы особенно интересно, если кто-нибудь может воспроизвести эту ошибку с другим 64-битным дистрибутивом MinGW. На данный момент я не знаю, является ли это проблемой с GCC/ Gfortran, MinGW, Anaconda или чем-то еще, свойственным моей собственной настройке.