2017-02-07 27 views
0

Я пытаюсь прочитать значение float из входного файла в Fortran.Исключение с плавающей запятой при чтении реальных значений из входного файла

Для этого я использую этот код:

... 
INTEGER   :: nf 
REAL    :: re 

OPEN(newunit=nf, file='toto.txt') 

READ(unit=nf, fmt=*) re 
... 

с toto.txt текстовый файл, содержащий мое реальное значение:

10.1001 ! this value is supposed to be read by the Fortran program 

Если я скомпилировать и выполнить, как это все работает хорошо.

Но у меня возникают проблемы при компиляции и выполнении с помощью опции fpe. У меня есть ошибка в readding линии, которая выглядит как:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation 

Backtrace for this error 
#0 0xfffffff 
#1 0xfffffff 
... 

Я использую gfortran команду: gfortran -g1 -c -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,inexact,denormal -Wall -fcheck=all my_prog.f90

я предполагаю мое действие чтение не является правильным. Так ли эта ошибка нормальная? Есть ли способ читать реальные ценности?

+1

Нам понадобится полный код и входной файл. См. [Mcve]. Поведение не является нормальным, и проблема, скорее всего, в другом месте. –

+2

Uh и не используйте 'inexact, denormal', вы действительно не хотите использовать это, если не знаете, что вы делаете! –

+3

из gfortran docs: «Многие, если не большинство, операции с плавающей запятой несут потерю точности из-за округления, и, следовательно, ffpe-trap = неточно, вероятно, будет неинтересным на практике». – agentp

ответ

0

Исключение с плавающей точкой неточного и denormal случается слишком часто и во время законного использования арифметики с плавающей точкой неточно. Почти все реальные арифметические операции с плавающей запятой. Даже чтение одного номера из файла или клавиатуры, потому что не все десятичные числа могут храниться точно в двоичном формате. Денормаль случается несколько реже, но использование все равно может быть законным.

Поэтому нецелесообразно улавливать эти исключения с плавающей запятой. Даже underflow является спорным. Я бы не потащил его по умолчанию, но я вижу его полезность.