RE:redondeo en fortran
Publicado por
trivi (1 intervención) el 01/04/2008 19:17:23
fijarle el numero de decimales en el formato no redondea, a eso se le llama truncar, y lo hace tambien cuando no puede representar mas cifras en la precision que sea, yo para redondear me cree un algoritmo (para practicar mas que nada) pero me daba fallos al pasar de base 2 a base 10, aparecian algunas cifras al final del numero (la 10ª cifra decimal o por ahi) k no deberian existir, aunque imagino que si existira la funcion intrinseca, aunque deberia tener dos entradas, el numero y el numero de decimales de redondeo
yo lo programaria en vez de en general, para el caso que tengas, que seria muy facil
aqui tienes el codigo, lo modifico un poco para dejarlo como una funcion (puede tener algun fallo y ahora creo que se puede mejorar la precision, poniendo las variables decimales en doble precision
FUNCTION RED(D,N)
IMPLICIT REAL*8 (A-H,O-Z), INTEGER*4 (I-N)
C D es el numero, N los decimales, si metes un numero negativo redondea esas cifras de la parte entera
C REDONDEO INCLUYENDO REALES NEGATIVOS
C N numero de decimales con que queremos el redondeo
DO WHILE (D.NE.0)
IF (D.GE.0) THEN
C D numero decimal que queremos redondear
F=D*10.D0**(N)
C F es un numero real D con los decimales desplazados a la izquierda N veces
J=F/1
C J es la parte entera de F
R=J+0.5D0
C R es la parte entera de F + 0.5
F2=J*10.D0**(-N)
C F2 nos da el numero D con N decimales (el resto truncados)
F3=(J+1)*10.D0**(-N)
C F3 nos da el numero D con N decimales y la ultima cifra distinta de cero es una unidad mayor que la de D
IF (R.GT.F) THEN
C Si es por defecto
D=F2
ELSE
C Si es por exceso
D=F3
ENDIF
ELSE
C Realizamos la misma rutina si es negativo, pero llevandolo a los positivos (al final volvemos a cambiar el signo)
D=-D
F=D*10.**(N)
J=F/1
R=J+0.5
F2=J*10.D0**(-N)
F3=(J+1)*10.D0**(-N)
IF (R.GT.F) THEN
WRITE (6,*) D=-F2
ELSE
WRITE (6,*) D=-F3
ENDIF
ENDIF
ENDDO
RETURN
END