Проблемы с четвёртой точностью кода на Фортране, скомпилированного с 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 или чем-то еще, свойственным моей собственной настройке.

0 ответов

Другие вопросы по тегам