2012-02-09 26 views
6

¿Es posible obtener más de 16 dígitos con double de precisión sin usar quadruple? Si es posible, ¿depende del compilador o de algo más? Porque sé que alguien dijo que estaba trabajando con precisión double y tenía 22 dígitos de precisión.Doble precisión extendida

Respuesta

6

El tipo de datos double precision se deriva de Fortran 77, y el único requisito para ese tipo es que tiene más precisión que real. No deberías usar eso más.

En Fortran 90/95 y versiones posteriores, se admiten al menos dos tamaños de números reales. La precisión está determinada por el parámetro kind, cuyo valor depende del compilador.

real(kind=8) :: a, b 

tener una forma portátil de definir la precisión, se puede obtener un valor kind que permite una cierta precisión mediante el uso de:

integer, parameter :: long_double = SELECTED_REAL_KIND(22) 

entonces se puede declarar sus variables como

real(kind=long_double) :: a, b 

pero no es seguro que su compilador admita esa precisión, en cuyo caso la función SELECTED_REAL_KIND devolverá un número negativo.

ver también this post

+0

Pero usted escribió 'entero '. ¿Podría solo 'entero 'tener 22 dígitos no' doble'? – Shibli

+0

'long_double' es un número entero que se utiliza para indicar el' tipo' de las variables 'reales' 'a' y' b' de manera que tengan al menos precisión 22 – steabert

+2

@Shibli También suele ser útil obtener los tipos de flota de precisión simple y doble en su sistema de manera portátil. Para esto uno puede usar 'integer, parameter :: sp = kind (1.e0)' y 'integer, parameter :: dp = kind (1.d0)'. A continuación, puede declarar una flotación de doble precisión como 'real (kind = dp) :: double'. – Chris

5

Como los primeros estados de respuesta, la forma más portátil es para especificar la precisión del número es el uso de las funciones intrínsecas. El concepto de diseño del lenguaje es que averigüe qué precisión se requiere para su cálculo y lo solicita, y el compilador proporciona esa precisión o mejor. Por ejemplo, si calcula que su solución de ecuación diferencial es estable con 11 cifras decimales, entonces solicita este valor y el compilador proporciona el mejor tipo que cumpla con sus requisitos. Este es un enfoque extranjero para la mayoría de los programadores, que están acostumbrados a pensar cuáles son las pocas opciones que ofrece el hardware en lugar de lo que necesitan, y tal vez no tan fácil ya que pocos de nosotros somos analistas numéricos.

Si desea utilizar el SELECTED_REAL_KIND intrínseco y optimizar para su compilador y hardware en particular, es posible que desee experimentar. Algunas combinaciones proporcionarán precisión cuadrupolar en el software, que será lenta. Un compilador que tenga precisión doble y una precisión extendida de 10 bytes proporcionará ese tipo más largo mediante selected_real_kind (17). Un compilador que tenga precisión doble y precisión cuádruple pero no una precisión extendida de 10 bytes proporcionará precisión de cuadrupolo mediante selected_real_kind (17) o selected_real_kind (32). (No conozco ningún compilador que admita tanto 10-bytes extendidos como cuadripolo). El compilador que carece de precisión cuadripolar devolverá -1 para selected_real_kind (32).

Cuestiones relacionadas