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 раза медленнее. И если в таком духе писать весь код, то и вся программа будет тормозным куском. Если бы второй метод еще был без деления (самая неудобная операция для компа), но оно есть и там и там.
_________________ Да не убивайся ты так! Ты же так никогда не убьёшься.
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 из примера такого типа достаточно с запасом.
_________________ Да не убивайся ты так! Ты же так никогда не убьёшься.
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 все большей разрядности за то же число циклов с каждым новым поколением.
_________________ Да не убивайся ты так! Ты же так никогда не убьёшься.
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 от подобного производительность как минимум не потеряет.
_________________ Да не убивайся ты так! Ты же так никогда не убьёшься.
Member
Статус: Не в сети Регистрация: 24.12.2009 Фото: 220
Помните страничную видеопамять у Вектор 06Ц и четырёх битное кодирование цвета, а эти 4 бита нужно было записать в одинаковые ячейки со сдвигом 8 кБ, а потом это считывалось и на цапе из 155РУ2 и резистивной матрице это всё можно было закодировать в 16 цветов (0 - 15 или 0Н - FH)из 256 цветовой палитры, при некоторых значениях оператора COLOR можно было получить инверсный текст.
_________________ Для увеличения производительности РС нужны только три вещи....
Member
Статус: Не в сети Регистрация: 08.05.2010 Откуда: Санкт-Петербург Фото: 10
Здравствуйте! А какие есть суждения по целесообразности апгрейда матрицы ноутбука? Я вот задумываюсь заменить штатную матрицу на MSI ALPHA 15 с FHD 144Hz на WQHD 165Hz, да ещё и с лучшей цветопередачей. По всем характеристикам (разъём, его расположение и т.д.) должно подойти... Есть ли подводные камни на этом пути? P.S. Я задал этот вопрос в ветке "Апгрейд ноутбуков" - нет никакого ответа... Возможно, это реально "тупой вопрос"?
Member
Статус: Не в сети Регистрация: 08.05.2008 Откуда: Москва Фото: 17
podvodnikVidyaevo основное здесь только твое финансовое состояние. Готов ты легко потерять деньги на новую матрицу если она просто не заработает или нет. Очевидно что контроллер ноута может не распознать инородный девайс который не прописан в его настройках. Но может и пропустит и даже заработает. Какие там прошивки или драйвера действуют знают только сервисмены или те кто сам много чего такого ремонтировал-менял.
Member
Статус: Не в сети Регистрация: 24.12.2009 Фото: 220
Подводные камни могут быть по креплению матрице, а именно может оказаться что она вклеена. Я менял на старом ноуте матрицу 1600х900 на FHD полумат, потому что родная матрица по углам была просто ужасна, новая матрица хотя тоже TN но по углам почти как IPS.
_________________ Для увеличения производительности РС нужны только три вещи....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения