TAXONOMÍA DE TIPOS REALES.







Tabla de Tipos de Datos de coma flotante en C
El lenguaje C ofrece varios tipos de datos para la representación de valores de coma flotante. Véase a continuación una tabla que muestra sus extensiones y alcances.

Nombre Tamaño Alcance
float 32 bits desde 1,17549e-38 hasta 3,40282e+38
double 64 bits desde 2,22507e-308 hasta 1,79769e+308
long double  96 bits (80 bits reales)  desde 1,68105e-4932 hasta 1,18973e+4932


En ciertos compiladores el long double tiene 96 bits de extensión, y permite almacenar números reales cuyo alcance va desde 1,68105e-4932 hasta 1,18973e+4932. Es evidente que para las operaciones habituales bastará con utilizar el tipo float; en el caso de realizarse cálculos que requieran un notable número de dígitos decimales (10 o más), será preciso emplear el tipo double o long double.

¿Punto flotante o coma flotante?

Téngase en cuenta que en los países de anglosajones se emplea el punto como separador entre la parte entera y parte decimal de los números reales, mientras que en España se emplea la coma. El lenguaje C, fiel a su origen anglosajón, utiliza el punto como separador de decimales.

Entrada/Salida de valores de coma flotante en C
Es un caso análogo al de la lectura y escritura de valores enteros, salvo que en este caso se van a utilizar los descriptores %f y %lf. El programa siguiente muestra la forma de leer y escribir valores de coma flotante.
#include<stdio.h>

float a, b ,c;
double d, e, f;

void main(void)
{
        printf("Escriba tres números separados por espacios:\n");
        
        scanf("%f %f %f", &a, &b, &c);
        
        printf("\n\nLos números eran: \n");
        
        printf("a = %f; b = %f; c = %f\n\n", a, b, c);
        
/*      ¡Atención! ¡Peligro! ¡No leer el código siguiente! */

        printf("\n\nSi fueran los coeficientes de una ecuación cuadrática,\n");
        printf("esa ecuación tendría ");
        
        d = b*b - 4.0 * a * c;
        
        (d > 0.0)       ?       printf("raices reales y distintas.\n")
                                :       ( (d < 0.0) ? printf("raices complejas conjugadas.\n")
                                                                : printf("una raiz real doble.\n") );

        printf("\n\nTerminación normal del programa.\n\n");
}
Aun cuando las líneas de código posteriores al comentario hacen uso del operador ?, que se estudiará más adelante, su significado se pone de manifiesto en los mensajes impresos mediante printf(). En efecto, este programa es capaz de indicar al usuario el tipo de ecuación de segundo grado correspondiente a los tres valores leidos a través del teclado, considerando una expresión de la forma     ax^2 + bx + c = 0 Resolveremos este tipo de ecuaciones en ejercicios posteriores. El operator ? tiene un comportamiento parecido al de if().

Operaciones elementales con valores de coma flotante.
Los signos de las cuatro reglas mencionados anteriormente (+, -, *, /) para los números enteros tienen idéntico significado en el caso de los números de coma flotante. Téngase en cuenta, sin embargo, que el formato binario (la representación interna) de un número entero es muy distinta de la correspondiente a un número de coma flotante. Para ser exactos, los int se codifican empleando el formato de complemento a doses,  mientras que los float hacen uso de un formato basado en un exponente y una mantisa. Aun cuando un int y un float ocupen 4 bytes, su estructura interna es radicalmente distinta. Por tanto, si se pretende asignar un valor entero a un número real o viceversa es preciso llevar a cabo un proceso de conversión. Véanse las funciones atol() y strtof(). Consúltense también los Ejercicios propuestos aquí.

Ejercicios propuestos

  1. Ejercicio 0102r01.-Construir un programa que pida las dimensiones de un rectángulo y calcule su área.
    #include<stdio.h>
    
    int main(int argc, char * argv) {
     float base, altura;
     float area;
     printf("\n\nÁrea de un rectángulo\n\n");
     printf("Escriba la base, por favor: ");
     scanf("%f", &base);
     printf("Escriba la altura, por favor: ");
     scanf("%f", &altura);
     area = base * altura;
     printf("\n\nUn rectángulo de base %f y altura %f tiene un área de %f\n",
        base,
        altura,
        area);
     printf("\n\nFin del programa\n\n");
     return 0;
    }
    
  2. Ejercicio 0102r02.-Construir un programa que pida el radio de una esfera y calcule su área y su volumen.
    /* 
     Superficie = 4*pi*r^2
     Volumen = 4/3*pi*r^3
    */
    #include<stdio.h>
    int main(int argc, char * argv) {
     float radio, superficie, volumen;
     float pi = 3.1415926535;
     
     printf("\n\nÁrea y volumen de una esfera\n\n");
     printf("Escriba el radio, por favor: ");
     scanf("%f", &radio);
     superficie = 4.0*pi*radio*radio;
     volumen = 4.0/3.0*pi*radio*radio*radio;
     printf("\n\nUna esfera de radio %f tiene una superficie de %f y un volumen de %f\n\n", radio, superficie, volumen);
     return 0;
    }
  3. Ejercicio 0102r03.-Construir un programa que pida las dimensiones de un prisma y calcule la superficie del mismo (suma de superficies de sus caras).
    #include<stdio.h>
    
    int main(int argc, char * argv[]) {
     /* Declaración de variables */
     float anchura, altura, profundidad;
     float sup_base, sup_frontal, sup_lateral,sup_total;
     /*Lectura de datos*/
     printf("\n\nSuperficie total de un prisma\n\n");
     printf("Por favor, deme la anchura     :");
     scanf("%f", &anchura);
     printf("Por favor, deme la altura      :");
     scanf("%f", &altura);
     printf("Por favor, deme la profundidad :");
     scanf("%f", &profundidad);
     /*Cálculo*/
     sup_base = anchura * profundidad;
     sup_frontal = anchura * altura;
     sup_lateral = profundidad * altura;
     sup_total = 2*(sup_base + sup_frontal + sup_lateral);
     /*Resultados*/
     printf("\n\nCaracterísticas del prisma :\n\n");
     printf("   Anchura     : %f\n", anchura);
     printf("   Altura      : %f\n", altura);
     printf("   Profundidad : %f\n\n", profundidad);
     printf("   Superficie de la base     : %f\n", sup_base);
     printf("   Superficie frontal        : %f\n", sup_frontal);
     printf("   Superficie lateral        : %f\n\n", sup_lateral);
     printf("***Superficie total          : %f\n\n", sup_total);
    
    }
  4. Ejercicio 0102r04.-Un camión transporta T kilogramos de baldosas; se sabe que cada baldosa pesa B kilogramos. Las baldosas se van a utilizar para recubrir una superficie rectangular. Se pide construir un programa que indique el número de baldosas que habría en un lado del mayor cuadrado que se pueda recubrir con ésas baldosas, sin romperlas.
    #include<stdio.h>
    #include<math.h>
    /*
     El problema es que no se pueden romper baldosas. Esto exige calcular
     el número de baldosas del lado del cuadrado máximo que se puede
     recubrir, y que no es otro que la raíz cuadrada del cociente de la
     carga del camión por el peso de una baldosas, esto es, la raíz
     cuadrada del número de baldosas. Ese número no va a ser entero
     en general; si lo fuera, se podría construir un cuadrado de
     dimensiones máximas para la carga. Sólo falta calcular la parte
     entera del cociente, y ése será el tamaño del cuadrado que se
     puede recubrir sin romper baldosas.
    */ 
    int main(int argc, char * argv[]) {
     float t, b;
     int lado;
     printf("\n\nNúmero de baldosas.\n\n");
     printf("Escriba el nº de kilogramos que transporta el camión: ");
     scanf("%f", &t);
     printf("Escriba el peso de una baldosa en kilogramos        : ");
     scanf("%f", &b);
     lado = (int)sqrt(t/b);
     printf("El lado del cuadrado es %d.\n\n", lado);
     return 0;
    }
  5. Ejercicio 0102r05.-Se dispone de dos matrices 2x2, cuya suma se quiere calcular. Se pide construir un programa que pida los datos oportunos y calcule el resultado deseado, mostrándolo después en pantalla.
    #include<stdio.h>
    
    int main(int argc, char * argv[])
     {
      float a11, a12, a21, a22;
      float b11, b12, b21, b22;
      float c11, c12, c21, c22;
      /* Lectura de datos */
      printf("\n\nSuma de matrices\n\n");
      printf("Escriba una matriz 2x2 por filas (a11, a12, a21 y a22):");
      scanf("%f %f %f %f", &a11, &a12, &a21, &a22);
      printf("Escriba otra matriz 2x2 por filas (b11, b12, b21 y b22):");
      scanf("%f %f %f %f", &b11, &b12, &b21, &b22);
      /* Cálculo */
      c11 = a11 + b11;
      c12 = a12 + b12;
      c21 = a21 + b21;
      c22 = a22 + b22;
      /* Impresión de resultados */
      printf("\n\nLa primera matriz es:\n\n");
      printf("|%f %f|\n|%f %f|", a11, a12, a21, a22);
      printf("\n\nLa segunda matriz es matriz es:\n\n");
      printf("|%f %f|\n|%f %f|", b11, b12, b21, b22);
      printf("\n\nLa matriz suma es:\n\n");
      printf("|%f %f|\n|%f %f|", c11, c12, c21, c22);
      printf("\n\nFin del programa.\n\n");
      
      return 0;
     }
  6. Ejercicio 0102r06.-Repetir el ejercicio anterior, calculando esta vez el producto de las matrices leídas.
    #include<stdio.h>
    
    int main(int argc, char * argv[])
     {
      float a11, a12, a21, a22;
      float b11, b12, b21, b22;
      float c11, c12, c21, c22;
      /* Lectura de datos */
      printf("\n\nProducto de matrices\n\n");
      printf("Escriba una matriz 2x2 por filas (a11, a12, a21 y a22):");
      scanf("%f %f %f %f", &a11, &a12, &a21, &a22);
      printf("Escriba otra matriz 2x2 por filas (b11, b12, b21 y b22):");
      scanf("%f %f %f %f", &b11, &b12, &b21, &b22);
      /* Cálculo */
      c11 = a11*b11 + a12*b21;
      c12 = a11*b12 + a12*b22;
      c21 = a21*b11 + a22*b21;
      c22 = a21*b12 + a22*b22;
      /* Impresión de resultados */
      printf("\n\nLa primera matriz es:\n\n");
      printf("|%f %f|\n|%f %f|", a11, a12, a21, a22);
      printf("\n\nLa segunda matriz es:\n\n");
      printf("|%f %f|\n|%f %f|", b11, b12, b21, b22);
      printf("\n\nLa matriz producto es:\n\n");
      printf("|%f %f|\n|%f %f|", c11, c12, c21, c22);
      printf("\n\nFin del programa.\n\n");
      
      return 0;
     }
  7. Ejercicio 0102r07.-En una clase de 10 alumnos, se dispone de las notas correspondientes a tres evaluaciones. Se pide calcular la nota media de cada alumno individual para las tres evaluaciones, y la media de la clase en cada evaluación.
    #include<stdio.h>
    
    /* Este problema se puede resolver empleando 10x3 variables
     para almacenar las calificaciones. Esto exigiría unas
     declaraciones de variables como las siguientes:
     
     float a11, a12, a13;
     float a21, a22, a23;
     float a31, a32, a33;
     float a41, a42, a43;
     float a51, a52, a53;
     float a61, a62, a63;
     float a71, a72, a73;
     float a81, a82, a83;
     float a91, a92, a93;
     float a101, a102, a103;
     
     en donde el primer número oscila entre 1 y 10
     y denota el alumno, y el segundo número oscila
     entre 1 y 3, y denota la evaluación. Afortunadamente,
     C ofrece estructuras matriciales, que se estudiarán
     en el Tema 6, y que permiten abreviar notablemente
     el programa, al emplear una sola variable de
     diez filas y tres columnas, en lugar de utilizar
     treinta variables diferentes.
    */
    
    #define ALUMNOS 10
    #define EVALUACIONES 3
    int main(int argc, char * argv[])
     {
      float notas[ALUMNOS][EVALUACIONES];
      float media_alumno[ALUMNOS];
      float media_evaluacion[EVALUACIONES];
      int i, j;
      float temp;
      /* Lectura de datos */
      printf("\n\nInforme de calificaciones.\n\n");
      for(i=0;i<ALUMNOS;i++)
       {
        printf("Escriba las notas de las tres evaluaciones del alumno %d: ",i);
        scanf("%f %f %f", &notas[i][0],&notas[i][1],&notas[i][2]);
       }
      /* Cálculo  de medias de cada alumno */
      for(i=0;i<ALUMNOS;i++)
       media_alumno[i] = (notas[i][0]+notas[i][1]+notas[i][2])/EVALUACIONES;
      /* Cálculo de medias de evaluación */
      for(i=0;i<EVALUACIONES;i++)
       {
        temp = 0.0;
        for(j=0;j<ALUMNOS;j++)
         temp = temp + notas[j][i];
        media_evaluacion[i] = temp/ALUMNOS;
       }
      /* Impresión de resultados */
      printf("\n\nTabla de resultados\n\n");
      for(i=0;i<ALUMNOS;i++)
       {
        printf("Alumno %d : %f %f %f %f\n", i,
                 notas[i][0],
                 notas[i][1],
                 notas[i][2],
                 media_alumno[i]);
       }
      printf("Evaluación %f %f %f\n", media_evaluacion[0], 
              media_evaluacion[1],
              media_evaluacion[2]);
      printf("\n\nFin del programa.\n\n");
      return 0;
     }