Vb математические расчеты неверные результаты

Я пытаюсь рассчитать ожидаемый «счет» для данного игрока в системе Эло*.

Проблемная строка кода выглядит следующим образом:

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

Когда я возвращаю значение expected(0) сразу после этой строки в виде msgbox в приложении Windows Forms, оно указывает, что значение равно 11, хотя оно должно быть 1 (expected(1) объявлен как массив целых чисел).

Когда я запускаю эту же строку кода в консольном приложении, она возвращает 1.

Есть ли причина, по которой эта строка кода вместо этого возвращает 11?

Обновлено: точный код подпрограмм как для консольного приложения, которое я тестировал (которое возвращает правильное значение), так и для приложения форм:

Формы:

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

Консоль:

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

Приведенные выше числовые значения (например, 400, 1000) буквально записываются в программу вот так, поскольку я просто проверял, работают ли они.

* вы можете посмотреть уравнение на странице википедии «Система рейтинга Эло», но я не думаю, что это важно в этой ситуации. В этой ситуации я моделирую, что у обоих игроков Эло равен 1000.

Установите Option Strict On и, возможно, опубликуйте фактический код, который генерирует эти значения.

Jimi 20.12.2020 22:40

Мне нужно изменить много вещей во всей моей программе, если я установлю Option Strict On, но я отредактирую, чтобы показать код.

Jacob 20.12.2020 23:06

Тогда в вашем приложении, скорее всего, есть много ненадежных вещей.

Jimi 20.12.2020 23:08

Хорошо, но как эта опция влияет на приведенный выше код?

Jacob 20.12.2020 23:13

Это не так. То, что у вас есть, или правильное t(0) = CInt((1 / (1 + (10 ^ (1000 - 1000) / 400)))) не воспроизводит этот результат. Я сомневаюсь, что это ваш настоящий код и эти настоящие значения, а также потому, что это: (10 ^ (1000 - 1000) — это просто 1, я не понимаю, зачем вам все это, чтобы просто добавить 1. Эти ценности, вероятно, приходят откуда-то еще, в другой форме.

Jimi 20.12.2020 23:21

Пришлите мне свой код Windows, и я буду рад изучить его. Получить 11 невозможно.

NoChance 21.12.2020 07:23

@Jacob Я тестирую приложение формы, и оно правильно возвращает 1. Как вы получили «11» в своем тесте?

Xingyu Zhao 21.12.2020 07:29

@XingyuZhao, было бы неплохо показать код, как вы получили «1».

NoChance 21.12.2020 07:31

@Jimi эти значения буквально записаны в программе именно так, как я написал выше; они нигде не объявлены, это просто числа. Причина, по которой у меня есть все это, чтобы просто добавить 1, заключается в том, что эти значения должны быть переменными, но они не работали, поэтому я изменил их на «1000», чтобы проверить это, и обнаружил, что это все еще не работает.

Jacob 21.12.2020 12:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
9
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я рад слышать, что ваша проблема решена, вы можете нажать «✔», чтобы отметить свой ответ как ответ.

Jack J Jun 28.12.2020 09:53

Ваша формула из Википидии:

Один из способов точно закодировать это:

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

Ваше выражение:

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

Не является точным переводом исходного форумала выше, ваше выражение выше возвращает ноль вместо 0,5. Если EA является целым числом, вы получите одинаковый результат в обоих вычислениях, но я думаю, что вы всегда должны получать правильное значение, а затем явно манипулировать им, а не манипулировать им неявно (например, компилятором).

Другие вопросы по теме