2017-01-21 3 views
0

Возможно ли достичь очень малых чисел в Фортране, например 1E-1200? Я знаю, как это сделать на питоне, но мой код для магистерской диссертации работает слишком медленно. Мой руководитель рекомендует мне использовать Fortran, но я не уверен, что это проблема.Очень маленькие цифры в Фортране

+0

Я fortranner, но тем не менее, я бы проверить, достаточно ли алгоритм. Изменение языка не создает чудеса, хотя некоторые петли медленны в Python. –

+3

Привет @wafelos. Часто бывает, что при использовании соответствующей единичной системы (т. Е. Атомных единиц https://en.wikipedia.org/wiki/Atomic_units) диапазон чисел с плавающей запятой становится намного более узким. Важно знать, что использование 128 типов точности, вероятно, замедлит ваши вычисления, поскольку они не поддерживаются аппаратным обеспечением. –

ответ

0

Большинство компиляторов Fortran поддерживают формат данных REAL128, который соответствует стандарту IEEE binary128. Некоторые поддерживают также REAL80 с аналогичным диапазоном, совпадающим с C long double. Они не имеют производительности REAL64, но должны быть намного быстрее, чем python.

+0

C не указывает, какой формат должен быть 'long double', так же как и любые другие типы. В MSVC 'long double' точно так же, как' double'. В платформах без 80-битной расширенной точности это может быть точность IEEE-754 с двойной точностью или четверной точностью –

1

Короткий ответ: да.

Современные компиляторы обычно поддерживают так называемую четырехмерную точность, 128-битную реальность. Портативный способ доступа к этому типу использует ISO_FORTRAN_ENV. Вот пример программы, чтобы показать, как большие и малые эти цифры получим:

program main 
    use ISO_FORTRAN_ENV, only : REAL32, REAL64, REAL128 

    ! -- tiny and huge grab the smallest and largest 
    ! -- representable number of each type 
    write(*,*) 'Range for REAL32: ', tiny(1._REAL32), huge(1._REAL32) 
    write(*,*) 'Range for REAL62: ', tiny(1._REAL64), huge(1._REAL64) 
    write(*,*) 'Range for REAL128: ', tiny(1._REAL128), huge(1._REAL128) 
end program main 

Типы REAL32, REAL64 и REAL128, как правило, известны как одно-, двух- и четырехъядерных точностью. Более длинные типы имеют больший диапазон представимых чисел и большей точности.

На моей машине с gfortran 4.8, я получаю:

mach5% gfortran types.f90 && ./a.out 
Range for REAL32:  1.17549435E-38 3.40282347E+38 
Range for REAL62:  2.2250738585072014E-308 1.7976931348623157E+308 
Range for REAL128: 3.36210314311209350626E-4932 1.18973149535723176502E+4932 

Как вы можете видеть, четырехъядерный точность может представлять числа как малые, как 3.4E-4932.

4

Предыдущие ответы, предлагающие использование REAL128 от ISO_FORTRAN_ENV, описывают непереносимое решение. То, что вы получите здесь, - это реальный тип, представление которого составляет 128 бит, но это ничего не говорит о диапазоне или точности типа! Например, некоторые системы IBM имеют 128-битный реальный вид, который на самом деле является двумя двойными с показателем смещения. Это дает вам больше точности, но не значительно больше.

Правильный способ сделать это - использовать встроенную функцию SELECTED_REAL_KIND для определения вида реализации, поддерживающего требуемый диапазон. Например:

integer, parameter :: bigreal = SELECTED_REAL_KIND(R=1200) 
real(KIND=bigreal) :: x 

Если реализация не имеет реальный вид, который может представлять значение с десятичной показателем плюс или минус 1200, вы получите сообщение об ошибке, в противном случае вы получите самый маленький соответствующий своего рода.

Вы также можете указать значение P = в вызове, чтобы указать, какая минимальная точность (в десятичных разрядах) вам нужна.