Herramientas de usuario

Herramientas del sitio


curso-cpp:mas-tipos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
curso-cpp:mas-tipos [2017/03/22 00:39]
santo [Tipos de punto flotante]
curso-cpp:mas-tipos [2017/11/26 22:39] (actual)
guty [Tipo de un literal entero]
Línea 22: Línea 22:
 Todos estos tipos se usan de la misma manera que ''​int'',​ y solo cambia la cantidad de memoria que utilizan estas variables y el rango de valores posibles. Por ejemplo es perfectamente válido lo siguiente: Todos estos tipos se usan de la misma manera que ''​int'',​ y solo cambia la cantidad de memoria que utilizan estas variables y el rango de valores posibles. Por ejemplo es perfectamente válido lo siguiente:
  
-<​code>​+<​code ​cpp>
 short x = 32; short x = 32;
 int y = 1000; int y = 1000;
Línea 41: Línea 41:
 Es decir, las versiones ''​unsigned''​ ocupan la misma memoria que sus correspondientes con signo, no permiten negativos, y a cambio llegan hasta números aproximadamente el doble de grandes como límite superior. La tabla de potencias de diez máximas representables es igual que antes, excepto que en ''​unsigned long long''​ ahora entra el número $10^{19}$, mientras que en ''​long long''​ solo se puede representar hasta $10^{18}$. Es decir, las versiones ''​unsigned''​ ocupan la misma memoria que sus correspondientes con signo, no permiten negativos, y a cambio llegan hasta números aproximadamente el doble de grandes como límite superior. La tabla de potencias de diez máximas representables es igual que antes, excepto que en ''​unsigned long long''​ ahora entra el número $10^{19}$, mientras que en ''​long long''​ solo se puede representar hasta $10^{18}$.
  
-===== Tipo de una literal entero =====+===== Tipo de un literal entero =====
  
 Cuando escribimos un número directamente en el código, como por ejemplo ''​x = y + 33;'',​ cabe preguntarse:​ ¿De qué tamaño es ese 33? Esto es importante para las cuentas intermedias,​ pues ese tipo define el tamaño del resultado. Por ejemplo, si hacemos ''​long long x = y + 1000000000;'',​ donde ''​y''​ es de tipo ''​int'',​ el resultado "​matemático"​ de la cuenta siempre entrará en el rango de ''​long long'',​ pero... ¿Es para la computadora el resultado de la cuenta un ''​long long''?​ Cuando escribimos un número directamente en el código, como por ejemplo ''​x = y + 33;'',​ cabe preguntarse:​ ¿De qué tamaño es ese 33? Esto es importante para las cuentas intermedias,​ pues ese tipo define el tamaño del resultado. Por ejemplo, si hacemos ''​long long x = y + 1000000000;'',​ donde ''​y''​ es de tipo ''​int'',​ el resultado "​matemático"​ de la cuenta siempre entrará en el rango de ''​long long'',​ pero... ¿Es para la computadora el resultado de la cuenta un ''​long long''?​
Línea 53: Línea 53:
 Similar problema tendremos si hacemos ''​long long x = y + z'',​ siendo tanto ''​y''​ como ''​z''​ variables de tipo ''​int''​. Podemos solucionarlo **convirtiendo** una de ellas a ''​long long'':​ ''​long long x = y + (long long)(z)'',​ de forma análoga a lo que hacíamos con el ''​LL''​ para los literales enteros. Similar problema tendremos si hacemos ''​long long x = y + z'',​ siendo tanto ''​y''​ como ''​z''​ variables de tipo ''​int''​. Podemos solucionarlo **convirtiendo** una de ellas a ''​long long'':​ ''​long long x = y + (long long)(z)'',​ de forma análoga a lo que hacíamos con el ''​LL''​ para los literales enteros.
  
-**El caso más común** donde esto ocurre es en la expresión: ''​1 << i''​ (que es común si se trabaja con [[cpp-avanzado:​bitmask|máscaras ​de bits]] de 64 bits): El resultado de esta operación será de tipo ''​int'',​ que no es lo que queremos si estamos trabajando valores de 64 bits. ''​1LL << i''​ resuelve por completo este problema.+**El caso más común** donde esto ocurre es en la expresión: ''​1 << i''​ (que es común si se trabaja con [[cpp-avanzado:​operaciones-de-bits|operaciones ​de bits]] ​con números ​de 64 bits): El resultado de esta operación será de tipo ''​int'',​ que no es lo que queremos si estamos trabajando valores de 64 bits. ''​1LL << i''​ resuelve por completo este problema.
  
 ===== Reglas prácticas para el manejo de tipos enteros ===== ===== Reglas prácticas para el manejo de tipos enteros =====
Línea 80: Línea 80:
 El tipo se utiliza en cuentas igual que hicimos con los enteros, pero se pueden usar números con coma (que en C++ se escriben siempre con ''​.'',​ y nunca con '',''​):​ El tipo se utiliza en cuentas igual que hicimos con los enteros, pero se pueden usar números con coma (que en C++ se escriben siempre con ''​.'',​ y nunca con '',''​):​
  
-<​code>​+<​code ​cpp>
 double x = 0.2; double x = 0.2;
 double y = x * 5.3; double y = x * 5.3;
Línea 91: Línea 91:
 Es muy común querer mostrar una cierta cantidad **fija** de decimales, y no que esto lo decida el programa arbitrariamente como ocurrió en el ejemplo. Esto se puede hacer incluyendo ''#​include <​iomanip>'',​ y agregando una línea al programa antes de utilizar ''​cout''​ para mostrar los números: Es muy común querer mostrar una cierta cantidad **fija** de decimales, y no que esto lo decida el programa arbitrariamente como ocurrió en el ejemplo. Esto se puede hacer incluyendo ''#​include <​iomanip>'',​ y agregando una línea al programa antes de utilizar ''​cout''​ para mostrar los números:
  
-<​code>​+<​code ​cpp>
 double x = 0.2; double x = 0.2;
 double y = x * 5.3; double y = x * 5.3;
Línea 105: Línea 105:
 </​code>​ </​code>​
  
-Una característica de los números de punto flotante es que **no dan resultados exactos**. Si bien tienen una precisión de 15 dígitos y normalmente los resultados son muy buenos generalmente,​ incluso para operaciones muy sencillas, no se puede asumir que los resultados que dan serán exactos, sino que debemos considerar siempre que tienen un pequeño error.+Una característica de los números de punto flotante es que **no dan resultados exactos**. Si bien tienen una precisión de 15 dígitos y normalmente los resultados son muy buenos generalmente,​ incluso para operaciones muy sencillas, ​**no se puede asumir que los resultados que dan serán exactos**, sino que debemos considerar siempre que tienen un pequeño error.
  
 Esto queda claro con el siguiente ejemplo: Esto queda claro con el siguiente ejemplo:
  
-<​code>​+<​code ​cpp>
 cout << fixed << setprecision(3);​ cout << fixed << setprecision(3);​
-    ​for (double x = 0.1; x < 1.0; x += 0.1) +for (double x = 0.1; x < 1.0; x += 0.1) 
-        cout << x << endl;+    cout << x << endl;
 </​code>​ </​code>​
  
Línea 146: Línea 146:
 0.99999999999999988898 0.99999999999999988898
 </​code>​ </​code>​
 +
 +Vemos que, si bien los errores relativos son extremadamente pequeños (aparecen recién en la cifra 15), **siempre están ahí**, así que no podemos tratar a los números como absolutamente exactos en nuestro programa.
  
 === Otros tipos de punto flotante === === Otros tipos de punto flotante ===
curso-cpp/mas-tipos.1490143148.txt.gz · Última modificación: 2017/03/22 00:39 por santo