Member
Статус: Не в сети Регистрация: 27.08.2011 Фото: 0
4e_alex писал(а):
Второй метод может показаться более интуитивным, т.к. сперва отделили "расстояние" между числами, потом нашли его "середину". Но в этом же его проблема, он рассчитан на 2 числа. А вообще надо уточнять, какое именно среднее хотят получить.
Это не проблема. У нас ведь условие два числа.
Йож писал(а):
среднее арифметическое определяется как число, равное сумме всех чисел множества, делённой на их количество. конец.
Advanced guest
Статус: Не в сети Регистрация: 03.12.2004
Toxa-134 писал(а):
В чистой математике без разницы. А в мире компьютеров есть ограничения на размеры чисел, из-за этого первый способ может вызвать переполнение, и результат будет неправильный. Для примера: в 1 байте 8 бит, они позволяют закодировать числа 0-255, если попытаться сложить 150 + 180, мы получим 74 из-за переполнения и поделив на 2 получим 37, что совсем не среднее.
Оперативная память условно бесконечна, а потому сейчас в большинстве софта переменные объявляются с большим запасом. А вот алгоритм с 3 операциями вместо 2 будет выполняться в 1.5 раза медленнее. И если в таком духе писать весь код, то и вся программа будет тормозным куском. Если бы второй метод еще был без деления (самая неудобная операция для компа), но оно есть и там и там.
_________________ Unfortunately for you, however, you are maidenless
Member
Статус: Не в сети Регистрация: 22.06.2008 Откуда: Ленинград
Код:
Математику уже затем учить надо, что она ум в порядок приводит
Xant1k писал(а):
либо взять разницу между ними и поделить на два, а потом добавить к меньшему или отнять от большого
пусть даны a и b, причем b > а. найдем разницу с = b - а поделим пополам с / 2 и прибавим к меньшему а + с/2 вспомним что с = b - a и подставим в это вот. a + (b - a) / 2 приведем дроби к общему знаменателю 2a / 2 + (b - a) / 2 сумма дробей это сумма их числителей (2a + b - a) / 2 и получаем на выходе (а + b) / 2
вроде уровень третьего класса? или когда там алгебра начинается?
Advanced guest
Статус: Не в сети Регистрация: 03.12.2004
Если существует подозрение, что размера переменных не хватит, то используют библиотеку GMP, как вариант.
Касательно исходного вопроса даже чат-бот считает, что среднее арифметическое находят сложением и делением. Конкретно он сделал accumulate массиву чисел и поделил на его размер.
#include <numeric> // Required for std::accumulate #include <vector> // Example container #include <iostream>
double calculateAverage(const std::vector<double>& data) { if (data.empty()) { return 0.0; // Or handle error for empty data } double sum = std::accumulate(data.begin(), data.end(), 0.0); return sum / data.size(); }
int main() { std::vector<double> numbers = {10.0, 20.0, 30.0, 40.0, 50.0}; double avg = calculateAverage(numbers); std::cout << "The average is: " << avg << std::endl; // Output: The average is: 30 return 0; }
Добавлено спустя 5 минут 49 секунд: Кстати по твоей же ссылке видно, что int является алиасом для int32. Меньший размер фактически вымер, его нет смысла использовать почти никогда. Объявлять все подряд минимум как 32 бита / 4 байта это стандартная практика примерно так с конца прошлого века наверное. Именно об этом я и писал ранее. Для 150 + 180 из примера такого типа достаточно с запасом.
_________________ Unfortunately for you, however, you are maidenless
Member
Статус: Не в сети Регистрация: 27.02.2009 Откуда: Новосибирск
4e_alex писал(а):
Кстати по твоей же ссылке видно, что int является алиасом для int32. Меньший размер фактически вымер, его нет смысла использовать почти никогда.
Это не так и причина в другом: дело в OS и разрядности компиляторов. Во времена DOS было int = int16. Меньшие типы активно используются, но надо понимать их ограничения. Это к вопросу о вычислении среднего значения, нельзя просто так брать и складывать числа без проверки на переполнения типов данных. Например, существует проблема 2038 года https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_2038_%D0%B3%D0%BE%D0%B4%D0%B0 тоже связанная с переполнением.
4e_alex писал(а):
Именно об этом я и писал ранее. Для 150 + 180 из примера такого типа достаточно с запасом
150 и 180 просто пример для byte. Для int(беззнакового 32bit, который uint32) всё сломается на 2 500 000 000 + 2 800 000 000. Так что надо смотреть шире, проблема не в конкретных значениях а в принципах представления чисел. А так простой int ещё и знаковый, и результат 1 500 000 000 + 1 800 000 000 вообще отрицательный будет.
Последний раз редактировалось Toxa-134 29.07.2025 13:10, всего редактировалось 1 раз.
Это не так и причина в другом: дело в OS и разрядности компиляторов.
ОС и компиляторы ориентируются на железо. Процессор читает и пишет большими кусками. В этом проблема старых умных академических книжек с алгоритмами. Там по крупицам экономили память. Но для современного железа эти алготмы плохо подходят. Сейчас проще гигабайтные матрицы на GPU перемножать, чем байтики перекладывать.
Member
Статус: Не в сети Регистрация: 27.02.2009 Откуда: Новосибирск
HskR писал(а):
ОС и компиляторы ориентируются на железо. Процессор читает и пишет большими кусками. В этом проблема старых умных академических книжек с алгоритмами. Там по крупицам экономили память. Но для современного железа эти алготмы плохо подходят. Сейчас проще гигабайтные матрицы на GPU перемножать, чем байтики перекладывать.
Наверное, именно поэтому основное нововведение RTX 50 это FP4? Который как раз маленький и сделан для этих самых быстрых вычислений на GPU.
Наверное, именно поэтому основное нововведение RTX 50 это FP4? Который как раз маленький и сделан для этих самых быстрых вычислений на GPU.
Одно не отменяет другое. FP4 появился как следующий виток экономии памяти. Как только смогут нарастить память в достаточном объеме от FP4 откажутся. Но заметь, что вычисление идет разом над всей матрицей. Байтики не перекладывают. Т.е. это современный алгоритм, только со ниженной точностью. А раньше мурыжили бы последовательно одно 32 битное число на 8 битном железе.
Member
Статус: Не в сети Регистрация: 27.02.2009 Откуда: Новосибирск
HskR писал(а):
Одно не отменяет другое. FP4 появился как следующий виток экономии памяти. Как только смогут нарастить память в достаточном объеме от FP4 откажутся.
Ну эта гонка вечная... Помнится знаменитое: "640 Кб должно быть достаточно для каждого" (с). Так что памяти будет всегда не хватать, и всегда будут придумывать какие-то способы это обойти.
Advanced guest
Статус: Не в сети Регистрация: 03.12.2004
Toxa-134 писал(а):
Меньшие типы активно используются, но надо понимать их ограничения.
Если это не микроконтроллеры какие-то, то понимая их ограничения надо просто не использовать их. А что и как часто используется я могу наблюдать когда пихаю чужой exe в отладчик. 99.5% переменных там из типов на 4 байта.
Toxa-134 писал(а):
Например, существует проблема 2038 года тоже связанная с переполнением.
У этой проблемы те же самые корни. Кто-то просто не подумав толком еще во времена когда 640 16 кб "хватало всем" выдумал все это.
Toxa-134 писал(а):
Так что надо смотреть шире, проблема не в конкретных значениях а в принципах представления чисел.
Проблема в том, что надо знать и предвидеть "use cases" своего приложения/кода. Тогда вопросов по типам данных будет меньше.
Toxa-134 писал(а):
основное нововведение RTX 50 это FP4
Это не значит, что там резко стали использовать переменные 4 бита. Используется квантизация, что по сути автоматический процесс. И главное отличие в том, что ALU видеокарты (конкретно 50 серии) физически способны делать в 2 раза больше операций над 4 битами по сравнению с 8. У центральных процессоров такого нет, скорее наблюдается движение в обратную сторону - AVX все большей разрядности за то же число циклов с каждым новым поколением.
_________________ Unfortunately for you, however, you are maidenless
Member
Статус: Не в сети Регистрация: 27.02.2009 Откуда: Новосибирск
4e_alex писал(а):
Проблема в том, что надо знать и предвидеть "use cases" своего приложения/кода. Тогда вопросов по типам данных будет меньше.
Просто эта задача вычисления среднего значения, как раз является классическим примером, на котором сыпятся новички в программировании. Обычно постановка задачи такая: найти среднее значение в массиве с элементами типа int. Результат этого вычисления тоже помещается в int, т.к. он точно меньше или равен самого большого числа в массиве. А вот промежуточные вычисления уже не помещаются, если просто складывать числа, но это совсем не очевидно. Поэтому при написании алгоритма надо это учитывать, второй из предложенных алгоритмов вычисления среднего тут больше подходит, хоть и трудозатратен. В случае int еще можно промежуточные значения хранить как long, но если числа большие сразу, то уже не всегда просто решить задачу.
4e_alex писал(а):
У центральных процессоров такого нет, скорее наблюдается движение в обратную сторону - AVX все большей разрядности за то же число циклов с каждым новым поколением
Как раз - нет. AVX (Advanced Vector Extensions) - это тоже векторные вычисления в CPU, суть там та же что и в GPU за 1 команду провести вычисления над несколькими числами. А разрядность это количество чисел в этом самом векторе. Т.е. увеличивая разрядность AVX увеличивают не точность, а количество параллельных операций над числами.
Advanced guest
Статус: Не в сети Регистрация: 03.12.2004
Можно конечно на это по-разному смотреть. В железе именно что стало шире. Zen 4 мог за раз прожевать 256, а 512 пролезало половинками. Zen 5 может 512 за раз (т.е. у него 512-разрядный операционный автомат aka datapath). Как оно там со стороны софта выглядит, и какой смысл туда его разработчик вкладывает - вопрос уже другой. Если на те же порты/считалки скормить 128 4-битных чисел без объединения их в коде/компилятором в одну операцию, то процессор это выполнит скорее всего в 128 раз медленнее. Если у него декодер не увидит и не сделает нужных манипуляций, что он может уметь, а может и не уметь, и вообще на него лучше не перекладывать такую работу. А видеокарта с поддержкой FP4 от подобного производительность как минимум не потеряет.
_________________ Unfortunately for you, however, you are maidenless
Member
Статус: Не в сети Регистрация: 24.12.2009 Фото: 186
Помните страничную видеопамять у Вектор 06Ц и четырёх битное кодирование цвета, а эти 4 бита нужно было записать в одинаковые ячейки со сдвигом 8 кБ, а потом это считывалось и на цапе из 155РУ2 и резистивной матрице это всё можно было закодировать в 16 цветов (0 - 15 или 0Н - FH)из 256 цветовой палитры, при некоторых значениях оператора COLOR можно было получить инверсный текст.
_________________ Для увеличения производительности РС нужны только три вещи....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения