Loading...
RaUndreundre avatar RaUndreundre 54 Точки

Проблем с overflow при INFINITY

Здравейте, задача от C++ фундаментъл курса.
Task 5 – Min and Max
Write a program that reads an integer number N, then a line of N integers, and prints the minimum and maximum of those integers

https://judge.softuni.bg/Contests/Compete/Index/2939#4
Ясно е че задачката си има няколко лесни решения. Реших обаче да "резна' малко едно от тези решения.
 

#include <iostream>
#include <cstdint>

int main() {
    int num;
    int min = INT32_MAX, max = INT32_MIN;
    std::cin >> num;
    for (int i = 0; i < num; i++) {
        int currNumber = 0;
        std::cin >> currNumber;
        if (currNumber < min) {
            min = currNumber;
        } else if (currNumber > max) {
            max = currNumber;
        }
    }
    std::cout << min << " " << max << std::endl;
    return 0;
}

И при някои определени комбинации от вход, получавам overflow, например:
 

Вход:
2
5 -1

Изход:
-1 -2147483648

И това е така, независимо дали ще ползвам INFINITY, INT_MAX, INT32_MAX.
Разбира се, с един if(i == 0){ ...  - вътре във loop-a тоя проблем се отстранява, но пък се обезсмисля, че по-горе се дава стойност безкрайност.
Въпроса ми е: Има ли вариант при който "безопасно" да се ползва INFINITY или  INT_MAX или INT32_MAX или друго подобно, и да няма изненади като overflow?

1
C++ Programming
MartinBG avatar MartinBG 4803 Точки
Best Answer

Проблемът не е в използването на INT_MAX или INT32_MAX, а в алгоритъма, който ще работи само при стойности, подадени в конкретна последователност (например -1 5, но не и 5 -1).

Лесно може да видите проблема, ако дебъгнете програмата.

Програмата ще изведе грешен резултат и при вход:

1
-1

=> -1 -2147483648

Втората стойност (max) не се променя, защото програмта приключва след едно число.

В горния пример отговорът трябва да е:

-1 -1

Това се оправя, ако двете проверки се правят независимо една от друга:

    if (currNumber < min) {
      min = currNumber;
    }
    if (currNumber > max) {
      max = currNumber;
    }

Инайте предвид, че и така програмата ще изведе грешен резултат при 0 въведени числа от конзолата :)

2
27/03/2021 15:29:38
RaUndreundre avatar RaUndreundre 54 Точки

:-) да, тоя else ми счупи главата - много тъпа грешка....

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.