Vb matemáticas cálculos resultados incorrectos

Estoy tratando de calcular el "score" esperado para un jugador dado en un sistema de elo*.

La línea problemática del código es la siguiente:

expected(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))

Cuando devuelvo el valor expected(0) directamente después de esta línea como msgbox en una aplicación de formularios de ventanas, establece el valor de ser 11 aunque debería ser 1 ()expected(1) es declarado como un conjunto de enteros).

Cuando ejecuto esta misma línea de código en una aplicación de consola, vuelve 1.

¿Hay alguna razón por la cual esta línea de código es en lugar de devolver 11?

Editar: El código exacto de las subrutinas para la aplicación de la consola que probé (que devuelve el valor correcto) y la aplicación de formularios:

Formas:

Dim expected(1) As Integer
expected(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
Msgbox(expected(0))

Consola:

Dim t(1) As Integer
t(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
Console.WriteLine(t(0))
Console.ReadLine()

Los valores numéricos anteriores (por ejemplo 400, 1000) están literalmente escritos en el programa así, ya que estaba probando si trabajan.

*puedes buscar la ecuación en la página wikipedia "Elo rating system" pero no creo que sea importante en esta situación. En esta situación estoy simulando a ambos jugadores Elo siendo 1000.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por quantumcoder403a


4 Respuestas:

  • Disculpa a cualquiera que estuviera rascando su cabeza en esto, pero la solución era muy simple y el problema era 100% mi culpa. Como resulta msgbox(expected(0) fue escrito como msgbox("expected 1" & expected(0)) que salió en la caja como "esperada 11" en lugar de "1" o "esperada 1 1". Pensé que 11 era el valor. Disculpa otra vez.

    Respondida el Dec 20, 2020 a las 21:30 - por csharpsorcerer

    Votos positivos: 0 | Votos negativos: 0

  • Su fórmula de Wikipidia es:

    enter image description here

    Una manera de codificar esto con precisión:

    Dim d1 As Double = (Rb - Ra) / 400R            '0
    Dim d2 As Double = 1 + System.Math.Pow(10, d1) '2
    Dim EA As Double = 1 / d2                      '0.5
    

    Su expresión:

       (1 / (1 + (10 ^ (1000 - 1000) / 400)))
    

    No es una traducción exacta de la fuente forumul arriba, su expresión arriba devuelve cero en lugar de 0.5. Si EA es un entero, valor obtendrá el mismo resultado de ambos cálculos, pero creo que siempre debe obtener el valor correcto entonces manipularlo explícitamente más bien manipularlo implícitamente (por ejemplo, por el compilador).

    Respondida el Dec 20, 2020 a las 21:39 - por compilerchieftain

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código de Visual Basic radica en la forma en que se están realizando las operaciones matemáticas en la expresión que calcula el "score" esperado. En este caso, la operación de potencia (10 ^ (1000 - 1000)) se está realizando antes de la división, lo cual afecta el resultado final.

    Para corregir este problema, necesitas agrupar la operación de potencia junto con la división utilizando paréntesis. La expresión corregida quedaría de la siguiente manera:

    vb
    expected(0) = (1 / (1 + (10 ^ ((1000 - 1000) / 400)))
    

    Al agrupar la operación de potencia y división entre paréntesis, se garantiza que la potencia se calcule después de efectuar la resta y la división, lo que producirá el resultado correcto de 1 en lugar de 11.

    Te recomiendo aplicar esta corrección en tu código y probar nuevamente para verificar que ahora obtienes el resultado esperado.

    Respondida el Dec 21, 2020 a las 21:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema radica en la precisión del tipo de datos Integer en Visual Basic. Un Integer solo puede almacenar números enteros dentro del rango de -32,768 a 32,767. El resultado de la expresión (1 / (1 + (10 ^ (1000 - 1000) / 400))) es aproximadamente 1,0000000000000002, que está fuera del rango de un Integer.

    Para resolver este problema, puedes utilizar el tipo de datos Double en su lugar, que puede almacenar números de punto flotante con mayor precisión. Aquí tienes el código corregido:

    vb
    Dim expected(1) As Double
    expected(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
    Msgbox(expected(0))
    

    Con este cambio, el código debería devolver el valor correcto de 1.

    Respondida el Dec 21, 2020 a las 21:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0