sábado, 6 de noviembre de 2010

FORTRAN. Puntos de precisión

Lenguajes de Programación - PUNTOS EXTRA

Existen muchas situaciones en las que la precisión de redondeo y precisión en calculos de punto flotante pueden trabajar para generar mejores resultados para un programador. Son cuatro las reglas que deben seguirse:

    1. Asegurarse de que si quieres tener resultados de doble precisión se especifiquen como de precisión doble, ya que en algunos casos el resultado será mas preciso en precisión doble que en precisión simple.

    2. Un valor numérico no siempre está representado con exactitud ya que los valores de  punto flotante no pueden representarse como un valor binario finito. Por ejemplo 0.1 es .0001100110011... en formato binario y se repite indefinidamente.

    3. Nunca supongas que el resultado es una precisión de la última posicióin decimal ya que siempre hay pequeñas diferencias entre la respuesta y lo que puede calcularse con la precisión finita de cualquier unidad de procesamiento de punto flotante.

    4. No compares dos valores de punto flotante para ver si son iguales o no. Esta es una consecuencia de la regla anterior, casi siempre habrán pequeñas diferencias entre los números que se supone que son iguales. Mejor compruebe si la diferencia entre esos números es insignificante o muy pequeña.

Estas reglan se aplican a todos los lenguajes. Les mostraré algunos ejemplos que encontré en una página donde se muestra algunas de las reglas en FORTRAN.

Ejemplo 1

Este ejemplo muestra que las constantes en FORTRAN son de presición simple de forma predeterminada y que los cálculos que contienen los términos de precisión simple no son mucho más precisos que los cálculos en el cual todos los términos son de precisión simple.

Se inicializó con 1.1, una constante de precisión simple y se imprime como variable de precisión simple, dando como resultado lo siguiente.

x = 1.100000000000000  y = 1.100000023841858

Al multiplicar un valor de precisión simple con un valor exacto de doble precisión es casi tan malo como multimplicar dos valores de precisión simple ya que ambos cálculos tienen tantos errores como multiplicar dos valoers de doble precisión.

true = 1.320000000000000 (multiplying 2 double precision values)
    y    = 1.320000052452087 (multiplying a double and a single)
    z    = 1.320000081062318 (multiplying 2 single precision values)
 
El código de este ejemplo es el siguiente.


C Compile options: none

       real*8 x,y,z
       x = 1.1D0
       y = 1.1
       print *, 'x =',x, 'y =', y
       y = 1.2 * x       z = 1.2 * 1.1
       print *, x, y, z
       end
 

Ejemplo 2
En este ejemplo se demostrará que los cálculos de doble precisión no son perfecto. Este ejemplo utiliza la ecuación quadratic. La entrada para la función  de la raíz cuadrada de este ejemplo es negativa y no es válida. En caso de que los cálculos de doble precisión no tuviera errores ligeros, el resultado sería.

Root =   -1.1500000000

en caso de que si tuviera erroers generaría el siguiente error.

error en tiempo de ejecución M6201: MATEMÁTICAS 
-sqrt: error de dominio

Código de este ejemplo.

C Compile options: none

       real*8 a,b,c,x,y
       a=1.0D0
       b=2.3D0
       c=1.322D0
       x = b**2
       y = 4*a*c
       print *,x,y,x-y
       print "(' Root =',F16.10)",(-b+dsqrt(x-y))/(2*a)
       end


Les dejo el link de donde saqué estos ejemplos por si quieren ver algunos otros, espero que les sirva de algo, saludos a todos:)

1 comentario: