Saltar al contenido principal
LibreTexts Español

4.3: Más Matemáticas

  • Page ID
    82463
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Bien, entonces, ¿qué pasa si sumamos o multiplicas dos int cortos juntos y el resultado tiene más de 16 bits de largo? Terminas con una condición de sobrerango. Tenga en cuenta que el compilador no puede advertirle de esto porque si esto sucede o no dependerá enteramente de los valores ingresados por el usuario y posteriormente calculados dentro del programa. Ojalá, siempre considerarás casos de valor máximo y elegirás tamaños de datos adecuados y esto no será un problema. Pero, ¿qué sucede realmente? En pocas palabras, se ignorarán los bits más altos. Considere un entero sin signo de 8 bits. Va de 0 a 255. 255 se representa como ocho 1s. ¿Qué pasa si le agregas el valor 1 a esto? Obtienes un número de 9 bits: un 1 seguido de ocho 0s. Ese noveno bit se desecha ya que la variable sólo tiene ocho bits. Así, ¡255 más 1 equivale a 0! ¡Esto puede crear algunos problemas serios! Por ejemplo, supongamos que desea utilizar esta variable como contador de bucle. Quieres pasar por un bucle 500 veces. El bucle nunca terminará porque un entero de 8 bits no puede subir tan alto. Sigues agregándole uno, pero sigue volteando a 0 después de que golpea 255. Este comportamiento no es del todo malo; de hecho, puede aprovecharse bien con cosas como interrupciones y temporizadores, como veremos.

    ¿Qué pasa si mezclas diferentes tipos de variables? Por ejemplo, ¿qué pasa si divides un double por un int o un float por double? C promoverá los tipos de menor tamaño/precisión al tipo más grande y luego realizará la operación. Esto a veces puede presentar un problema si intentas volver a asignar el resultado a algo más pequeño, aunque sepas que siempre “encajará”. El compilador se quejará si divide un int largo por otro int largo e intenta asignar el resultado a un int corto. Puedes sortear esto usando un elenco. Esta es tu forma de decirle al compilador que sabes que hay un problema potencial, pero para seguir adelante de todos modos (ojalá, porque sabes que siempre va a funcionar, no solo porque quieres derrotar a la advertencia del compilador). La conversión en C es similar a la conversión de tipos en Python (por ejemplo, la función int ()). He aquí un ejemplo.

    short int x, y=20;
    long int z=3;
    
    x=(short int)(y/z);

    Observe cómo está dirigiendo al compilador para que convierta la división en un int corto. De lo contrario, el resultado es de hecho un int largo debido a la promoción de y al nivel de z. ¿Cuál es el valor de x? ¡Por qué son 6 por supuesto! Recuerde, la parte fraccional no tiene sentido, y por lo tanto perdida, en divisiones enteras.

    El casting también es útil cuando se utilizan funciones matemáticas. Si tienes que usar float, puedes lanzarlos a/desde double para hacer uso de funciones definidas con double. Por ejemplo, supongamos que a, b y c se declaran como float pero desea usar la función pow () para elevar a la potencia b. pow () se define como tomar dos argumentos dobles y devolver una respuesta doble.

    c = (float)pow( (double)a, (double)b );
    

    Este es un ejemplo muy explícito. Muchas veces puedes confiar en una promoción de “reparto silencioso” para hacer tu trabajo por ti como en el ejemplo entero anterior. A veces ser explícito es una buena práctica solo como una forma de documentación.


    This page titled 4.3: Más Matemáticas is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.