Saltar al contenido principal
LibreTexts Español

6.3: Error numérico

  • Page ID
    115552
  • \( \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}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Considere la siguiente declaración de python al responder las preguntas a continuación:

    0.1 + 0.2 == 0.3
    False
    Pregunta

    ¿Por qué Python devuelve False a pesar de que la afirmación anterior es claramente cierta?

    Hacer esto

    Consideremos otro ejemplo. Ejecute el siguiente código que debería devolver true.

    import numpy as np
    J = np.array([20])
    L = [20]
    
    pow(L[0],8) == pow(J[0],8)
    True

    Si tienes instalada una versión anterior de numpy (como 1.18.5) entonces los resultados de ejecutar la celda anterior pueden ser falsos (¿alguien obtuvo este resultado?). Esto se debe a que numpy cambió la forma en que maneja algo llamado “error de redondez”. aquí hay otra celda que puede ayudarte a ver mejor lo que está pasando:

    import numpy as np
    J = np.array([20])
    L = [20]
    print(pow(20,8))
    print(pow(L[0],8))
    print(pow(J[0],8))
    25600000000
    25600000000
    25600000000
    

    La versión anterior de numpy devolvería lo siguiente:

    25600000000
    25600000000
    -169803776
    

    Podríamos decir que siempre actualicemos a la última versión estable (generalmente una buena idea). Pero algunas otras bibliotecas que dependen de numpy pueden no estar actualizadas por lo que a veces python instalará una versión anterior para mantener la compatibilidad. Por ejemplo, un programa muy popular es tensorflow, que a menudo requiere una versión anterior de numpy.

    Pregunta

    Si Python a veces se equivoca, ¿por qué lo usamos?

    Pregunta

    ¿Cuáles son las formas que puede hacer para estar atento a este tipo de errores?

    Pregunta

    Modifique el siguiente programa para devolver True si los valores están dentro de algún pequeño número (e) el uno del otro.

    def checktrue(a,b,e=0.001):
        return a == b
    
    #Test function
    checktrue(0.1+0.2, 0.3)
    False
    Pregunta

    ¿Cuál es un buen valor para establecer para e y por qué?

    Pregunta

    Los errores que se ven en este ejemplo parecen ser bastante comunes en Python. Vea si puede encontrar una función en Numpy que tenga el mismo propósito que checktrue:

    El programa de comprobación de respuestas de clase tomará en consideración el error de redondear. Por ejemplo, el comando checkanswer.float consideraría ambos correctos:

    from urllib.request import urlretrieve
    urlretrieve('https://raw.githubusercontent.com/colbrydi/jupytercheck/master/answercheck.py', 
                'answercheck.py');
    from answercheck import checkanswer
    
    checkanswer.float(0.300,'e85b79abfd76b7c13b1334d8d8c194a5');
    Testing 0.3
    Answer seems to be correct
    
    
    checkanswer.float(0.1+0.2,'e85b79abfd76b7c13b1334d8d8c194a5')
    Testing 0.3
    Answer seems to be correct
    
    

    This page titled 6.3: Error numérico is shared under a CC BY-NC 4.0 license and was authored, remixed, and/or curated by Dirk Colbry via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.