• Sábado 20 de Abril de 2024, 08:50

Autor Tema:  No entiendo muy bien el tipo float  (Leído 2313 veces)

jesusanz

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
No entiendo muy bien el tipo float
« en: Martes 30 de Noviembre de 2010, 17:24 »
0
Buenas!

Pues estoy iniciándome y no entiendo muy bien el tipo float. ¿Cuándo se le asigna una variable a este tipo?

Haber si me podéis despejar o si conocéis una web para poder distinguir cuándo usar los diferentes tipos de variables.

Gracias!

alb

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: No entiendo muy bien el tipo float
« Respuesta #1 en: Martes 30 de Noviembre de 2010, 19:54 »
0
Holà,
Los tipos 'nativos' de C y de C++ son :
**** integer types ****
char : bastante para contenir un 'execution caracter set'
signed char, short, int, long son signed integers types. No se sabe cuanto occupan cada uno de esos tipos (sus tamaños) pero la norma indica lo mìnimo que tiene que caber en cada uno de ellos :
signed char [-127;128[
short [-32767,32768[
int [-32767,32768[
long [-2147483647,2147483648[
C define tambien long long que no existe todavia en C++ pero me parece que debe ser introducido con C++0x.
long long [-9223372036854775807,9223372036854775808[

C++ tiene bool que puede contener true/false. En C90 no hay boolean tipo pero en C99 hay _Bool que debe poder contenir 0 y 1.

Estos tipos existen tambien en unsigned : unsigned char, unsigned short, unsigned int, unsigned long (y unsigned long long en C) con valores :
unsigned char [0;255[
unsigned short [0;65535[
unsigned int [0;65535[
unsigned long [0;4294967295[
unsigned long long [0;18446744073709551615[
Ai que notar que signed char != char != unsigned char : son tres tipos distinctos. Pero short/signed short, int/signed int, long/signed long, long long/signed long long son los mismos.
Tambien sizeof(char)==1 esto siempre aun que char puede occupar mas de 8 bits.
En los ordenadores modernos en 32 bits, los tipos suelen ser :
char/unsigned char : 8 bits
short/unsigned short : 16 bits
int/unsigned int : 32 bits
long/unsigned long : 32 bits
long long/unsigned long long : 64 bits.
En 64 bits, int, long pueden ser en 64 bits sin que sea eso la norma.
En desarrollo para lo embedido (? embedded), es todavia normal trabajar con int/unsigned int en 16 bits. Existe tambien procesador con char sobre 10 bits y short con 20 bits.

Lo que tienes que recordar :
char <= short <= int <= long <= long long
unsigned char <= unsigned short <= unsigned int <= unsigned long <= unsigned long long

y los intervales garantizados por la norma :
signed char [-127;128[
short [-32767,32768[
int [-32767,32768[
long [-2147483647,2147483648[


unsigned char [0;255[
unsigned short [0;65535[
unsigned int [0;65535[
unsigned long [0;4294967295[
unsigned long long [0;18446744073709551615[


Los mìnimos y los maximos de cada tipos te lo da el compilador :
En C, estan definidos en <limits.h>
Código: C
  1. #define CHAR_BIT   specific compiler value
  2. #define CHAR_MAX   specific compiler value
  3. #define CHAR_MIN   specific compiler value
  4. #define INT_MAX    specific compiler value
  5. #define INT_MIN    specific compiler value
  6. #define LONG_MAX   specific compiler value
  7. #define LONG_MIN   specific compiler value
  8. #define LLONG_MAX  specific compiler value
  9. #define LLONG_MIN  specific compiler value
  10. #define MB_LEN_MAX specific compiler value
  11. #define SCHAR_MAX  specific compiler value
  12. #define SCHAR_MIN  specific compiler value
  13. #define SHRT_MAX   specific compiler value
  14. #define SHRT_MIN   specific compiler value
  15. #define UCHAR_MAX  specific compiler value
  16. #define USHRT_MAX  specific compiler value
  17. #define UINT_MAX   specific compiler value
  18. #define ULONG_MAX  specific compiler value
  19. #define ULLONG_MAX specific compiler value
  20.  
En C++, estan definidos en <limits> y se obtene los min/max con dedicado std::numeric_limits :
Código: C++
  1. std::numeric_limits<signed char>::min()
  2. std::numeric_limits<signed char>::max()
  3. std::numeric_limits<unsigned char>::min()
  4. std::numeric_limits<unsigned char>::max()
  5. std::numeric_limits<short>::min()
  6. std::numeric_limits<short>::max()
  7. std::numeric_limits<unsigned short>::min()
  8. std::numeric_limits<unsigned short>::max()
  9. std::numeric_limits<int>::min()
  10. std::numeric_limits<int>::max()
  11. std::numeric_limits<unsigned int>::min()
  12. std::numeric_limits<unsigned int>::max()
  13. std::numeric_limits<long>::min()
  14. std::numeric_limits<long>::max()
  15. std::numeric_limits<unsigned long>::min()
  16. std::numeric_limits<unsigned long>::max()
  17.  

Tambien podria hablar de intN_t, uintN_t y otros tipos definidos en <stdint.h> en C99, que no existen en C++03 pero son definidos en C++0X en <cstdint>. Esos tipos son definidos para garantizar su tamaño : exacto (intN_t), a minimo (int_leastN_t) o optimizado ((int_fastN_t)

**** real types ****
C y C++ definen 3 tipos : float, double y long double con la restricción : lo que cabé en float, debe caber en double y lo que cabe en double debe caber en long double.
Y tambien tienes min/max par esos tipos en <float.h> en C y con std::numeric_limits<float/double/long double> en C++ con valores al minimo de 1.17549435E-38F y al maximo de 3.40282347E+38F par esos tres tipos.

Pero las valores suelen ser :
Código: C
  1. #include <float.h>
  2. FLT_MIN  1.17549435E-38F
  3. FLT_MAX   3.40282347E+38F
  4.  
  5. DBL_MIN 2.2250738585072014E-308
  6. DBL_MAX 1.7976931348623157E+308
  7.  
  8. LDBL_MIN 3.3621e-4932
  9. LDBL_MAX - 1.18973e+4932
  10.  
y en C++
Código: C++
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. template<typename type>
  5. void dump()
  6. {
  7.     std::cout<<std::numeric_limits<type>::min()<<" ; "<<std::numeric_limits<type>::max()<<"n";
  8. }
  9. int main()
  10. {
  11.     dump<float>();
  12.     dump<double>();
  13.     dump<long double>();
  14.     return 0;
  15. }
  16.  
  17.  
produe con mi ordenador (puede cambiar selun tu compilador/OS/processor) :
Citar
1.17549e-038 ; 3.40282e+038
2.22507e-308 ; 1.79769e+308
3.3621e-4932 ; 1.18973e+4932

Aun que no es normativo, los tipos real suelen seguir la norma IEC 60559. Los tipos real suelen ser representado con
[S|Exponent|                    fraction                     ]
S : one bit
Exponent y fraction van a ser diferentes segun que sea float, double o long double
float : 32 bits con 8 bit para exponent y 23 bit para fraccion
double : 64 bits con 11 bit para exponent y 52 bit para fraccion
long double : 96 bits con 15 bit para exponent y 80 bit para fraccion
El modo de calculo de los reales es un poco tecnico par ser explicado aqui. Te puedes referir a la entrada de wikipedia que me parece bastante clara : IEEE 754-1985
Los tamaños de float (32bits), double (64 bits) y long double (96 bits) no dependen tanto de saber si tienes processor/OS de 32 o 64 bits porque el calculo con tipos real tiene una unidad dedicada en el processor. De memoria, ya el intel 8087 tenia float sobre 32bits y double sobre 64 bits (long double sobre 80 bits me parece). Cuando al mismo tiempo, el 8086 estaba sobre 16 bits (int == short == 16 bits). Aunque es verda que 8086 y 8087 son de un dato que los menos de veinte años no se pueden recordar  :D

Los problemas con los tipos real es que necesitan rapidamente conocimiento matématico por problemas de representacion, convercion, precicion, error de calculo etc. Un documento muy interesante à leer : What Every Computer Scientist Should Know About Floating-Point Arithmetic de David Goldberg

**** y ademas ****
todavia queda de decir sobre los tipos pointers y void (C++) que tambien hacen parte de tipos fundamuntales del lenguage.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: No entiendo muy bien el tipo float
« Respuesta #2 en: Miércoles 1 de Diciembre de 2010, 01:05 »
0
Si quieres una respuesta rápida: float se refire a floating-point number (número de coma flotante) y se usa para números "decimales", números reales o número "con coma", por ejemplo 23.495,6789. Tienen un límite de precisión. Te aconsejo que te leas lo que te ha puesto alb.

Saludos

x.cyclop

  • Miembro de PLATA
  • *****
  • Mensajes: 1039
  • Nacionalidad: mx
    • Ver Perfil
Re: No entiendo muy bien el tipo float
« Respuesta #3 en: Viernes 3 de Diciembre de 2010, 20:27 »
0
Cita de: "m0skit0"
Si quieres una respuesta rápida:........... Te aconsejo que te leas lo que te ha puesto alb.
:P

- Great works aren't produced on the first try. [Ernest Hemingway]
- Be ambitious, yet realistic in your dreams. Do something that makes a positive impact. Don’t let the nay-sayers get you down. [Bjarne Stroustrup]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: No entiendo muy bien el tipo float
« Respuesta #4 en: Sábado 4 de Diciembre de 2010, 11:09 »
0
Ejem donde has puesto puntos suspensivos, hay una explicación. El hecho es que es aconsejable que lea un resumen y luego los detalles (pero no hay que olvidar leer los detalles).

De todas formas, gracias por tu inestimable aporte  :P

jesusanz

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: No entiendo muy bien el tipo float
« Respuesta #5 en: Lunes 13 de Diciembre de 2010, 12:38 »
0
Muchas Gracias a todos!

Esque sigo sin entenderlo. Estamos de acuerdo en que el lenguaje C tiene distintos tipos de variables y que dependiendo del tipo que sea luego podremos mediante long, short... darle un espacio en memoria. Pero el tipo float y double sirven para a una variable guardarle un espacio en memoria?

Estoy iniciándome en C por lo que pido que cuanto menos tecnicismos empleéis mejor  =P

Gracias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: No entiendo muy bien el tipo float
« Respuesta #6 en: Lunes 13 de Diciembre de 2010, 12:45 »
0
Cita de: "jesusanz"
Pero el tipo float y double sirven para a una variable guardarle un espacio en memoria?
Claro, como los demás tipos. 32 bits para float y 64 bits para double como ya te han explicado. Los punteros son los únicos que no reservan espacio; bueno miento, reservan espacio para un puntero, pero no para el dato al que apuntan.