Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
curso-cpp:mas-tipos [2017/10/29 19:19] santo |
curso-cpp:mas-tipos [2017/11/26 22:39] (actual) guty [Tipo de un literal entero] |
||
---|---|---|---|
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 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: | ||
Línea 147: | Línea 147: | ||
</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. | + | 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 === |