undefined
Tabla de fichas | Indice del Tema | 0102 |
0101 | 0102 | 0103 | 0104 | 0105 | 0106 | 0107 | 0108 |
![]() Universidad de Salamanca | ![]() Departamento de Informática y Automática | Tipos Reales © 2006- José R. García-Bermejo Giner |
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 |
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
.
%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().
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í.#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; }
/* 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; }
#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); }
#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; }
#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; }
#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; }
#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", ¬as[i][0],¬as[i][1],¬as[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; }