2012-02-09 3 views
6

Возможно ли получить более 16 цифр с точностью double без использования quadruple? Если это возможно, зависит ли он от компилятора или чего-то еще? Потому что я знаю, что кто-то сказал, что он работает с точностью double и имеет 22-значную точность.Расширенная двойная точность

ответ

6

Тип данных double precision Стебли из Fortran 77, и единственным требованием для этого типа является то, что имеет большую точность, чем real. Вы больше не должны этого использовать.

В Fortran 90/95 и более, поддерживаются по крайней мере два размера реальных чисел. Точность определяется параметром kind, значение которого зависит от компилятора.

real(kind=8) :: a, b 

Чтобы иметь переносимый способ определения точности, вы можете получить значение kind, что позволяет определенную точность при использовании:

integer, parameter :: long_double = SELECTED_REAL_KIND(22) 

то вы можете объявлять переменные как

real(kind=long_double) :: a, b 

, но не уверен, что ваш компилятор будет поддерживать эту точность, и в этом случае функция SELECTED_REAL_KIND вернет отрицательное число.

смотри также this post

+0

Но вы написали 'integer'. Может ли только «целое» иметь 22 цифры, а не «double»? – Shibli

+0

'long_double' - это целое число, которое используется для обозначения' вида' 'реальных' переменных' a' и 'b', так что они имеют как минимум точность 22 – steabert

+2

@Shibli. Также часто бывает полезно получить виды одиночная и двойная точность плавает на вашей системе в переносном режиме. Для этого можно использовать 'integer, parameter :: sp = kind (1.e0)' и 'integer, parameter :: dp = kind (1.d0)'. Затем вы можете объявить float с двойной точностью как 'real (kind = dp) :: double'. – Chris

5

В качестве первых состояний ответа, самый портативный способ, чтобы указать точность числа, чтобы использовать встроенные функции. Концепция дизайна языка заключается в том, что вы определяете, какая точность требуется для вашего расчета и запрашивает его, а компилятор обеспечивает эту точность или лучше. Например, если вы подсчитаете, что ваше решение дифференциального уравнения стабильно с 11 десятичными цифрами, вы запрашиваете это значение, а компилятор обеспечивает наилучший тип, отвечающий вашим требованиям. Это иностранный подход к большинству программистов, которые привыкли думать о том, что несколько вариантов предоставляют аппаратные средства, а не то, что им нужно, и, может быть, не так просто, поскольку немногие из нас являются численными аналитиками.

Если вы хотите использовать встроенный SELECTED_REAL_KIND и оптимизировать его для вашего конкретного компилятора и оборудования, вы можете поэкспериментировать. Некоторые комбинации обеспечат квадрупольную точность в программном обеспечении, которая будет медленной. Компилятор с двойной точностью и 10-байтовой расширенной точностью обеспечит более длинный тип с помощью selected_real_kind (17). Компилятор с двойной точностью и четкой точностью, но не с 10-кратной расширенной точностью обеспечит точность квадруполя через selected_real_kind (17) или selected_real_kind (32). (Я не знаю какого-либо компилятора, который поддерживает как 10-байтные расширенные, так и квадрупольные.) Компилятор, которому не хватает точности квадруполя, вернет -1 для selected_real_kind (32).

Смежные вопросы