У меня есть устаревший проект на Фортране с очень интенсивными вычислениями. Я хочу, чтобы этот математический код был доступен для кода C / C ++, поэтому я создал библиотеку FORTRAN, импортировал ее в C / C ++ и начал получать потери с плавающей запятой из моей библиотеки FORTRAN.
В то же время dll-код на FORTRAN выполняется нормально, если я вызываю его из приложения на FORTRAN.
Наконец, я обнаружил, что у компилятора, который я использую (это FTN 95, интегрированный в VS2013) есть опция (/ Underflow). Если этот флаг не указан, по умолчанию все нижние значения конвертируются в нули. Это происходит в приложении FORTRAN. Когда я использую код C для выполнения методов из этой библиотеки, я получаю недостаточное количество.
Итак, вопрос: есть ли способ заставить компилятор VC ++ конвертировать недопустимые значения в нули?
П.С .: Да, я понимаю, что глупо полагаться на код, который выкидывает исключения с плавающей точкой. Однако этот код устарел, и на данный момент невозможно полностью переписать его, используя современные методы.
Итак, проблема была с компилятором FTN95. Упомянутый выше флаг (/ Underflow) кажется полезным только при сборке приложения. Эффект этого флага игнорируется, если целевым выходом является DLL. Вместо этого я нашел директиву компилятора, доступ к которой осуществляется через вызов MASK_UNDERFLOW @ () подпрограмма. После вставки явного вызова этой подпрограммы в функцию FORTRAN, которая генерировала недостаточные значения и перекомпилировала DLL, мне удалось успешно запустить программу на C и выполнить необходимые вычисления с использованием функций из библиотек FORTRAN. Кроме того, FP: / except- Флаг компилятора VC ++ использовался, чтобы гарантировать, что никакие другие недопущения не повлияют на выполнение программы на Си.