Я по-прежнему не проверил ее достаточно, но по какой-то причине, используя определенные неотрицательные значения, эта функция иногда возвращает отрицательное значение. Я провел много ручного тестирования в калькуляторе с разными значениями, но мне еще не показалось, что это такое поведение.Функция Возвращаемое отрицательное значение
Мне было интересно, если кто-то взглянет на меня, если я что-то упустил.
float calcPop(int popRand1, int popRand2, int popRand3, float pERand, float pSRand)
{
return ((((((23000 * popRand1) * popRand2) * pERand) * pSRand) * popRand3)/8);
}
Переменные содержат случайно сгенерированных значения:
popRand1: от 1 до 30
popRand2: от 10 до 30
popRand3: от 50 до 100
pSR и: от 1 до 1000
pERand: b etween 1.0f и 5500.0f, которая затем умножается на 0.001f перед передачей функции выше
Edit:
Хорошо так после того, как после выполнения немного более близко это не вина этой функции непосредственно. Он создает бесконечно положительный поплавок, который затем переворачивается отрицательно, когда я использую этот код позже:
pPMax = (int) pPStore;
pPStore - это поплавок, который возвращает popCalc.
Итак, вопрос в том, как я могу остановить формулу от этого? Тестирование даже с очень высокими значениями в калькуляторе никогда не отображало этого поведения. Есть ли что-то в том, как компилятор обрабатывает порядок операций, вызывающих это, или мои значения просто просто слишком высоки?
Я предполагаю, что вы переполнены, то есть значение настолько велико, что оно становится отрицательным из-за того, как оно представлено в памяти. – Borgleader
Что такое пример ввода, который производит отрицательный вывод? –
Обратите внимание, что только целочисленное переполнение приведет к отрицательному результату. переполнение флота приведет к положительной бесконечности. Каков размер int? –