Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 52097 • Страница 2605 из 2605<  1 ... 2601  2602  2603  2604  2605
  Версия для печати (полностью) Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 27.08.2011
Фото: 0
4e_alex писал(а):
Второй метод может показаться более интуитивным, т.к. сперва отделили "расстояние" между числами, потом нашли его "середину". Но в этом же его проблема, он рассчитан на 2 числа.
А вообще надо уточнять, какое именно среднее хотят получить.

Это не проблема. У нас ведь условие два числа.

Йож писал(а):
среднее арифметическое определяется как число, равное сумме всех чисел множества, делённой на их количество. конец.

Привет чатжпт :crazy:



Партнер
 

Member
Статус: Не в сети
Регистрация: 09.02.2014
Фото: 0
Xant1k писал(а):
У нас ведь условие два числа.


первый способ, т.к. он рациональнее

Йож писал(а):
среднее арифметическое определяется как число, равное сумме всех чисел множества, делённой на их количество. конец.


Xant1k писал(а):
Привет чатжпт :crazy:


https://ru.wikipedia.org/wiki/%D0%A1%D1 ... 0%BE%D0%B5 это определение


 

Member
Статус: Не в сети
Регистрация: 22.06.2008
Откуда: Ленинград
Toxa-134 писал(а):
мы получим 74 из-за переполнения
мы получим ошибку переполнения и остановку вычислений.


 

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

вроде уровень третьего класса? или когда там алгебра начинается?


 

Member
Статус: Не в сети
Регистрация: 27.02.2009
Откуда: Новосибирск
4e_alex писал(а):
Оперативная память условно бесконечна, а потому сейчас в большинстве софта переменные объявляются с большим запасом.

Какого типа надо объявить переменную чтобы в нее вошло число 12 618 446 744 073 709 551 615, если в языке есть только такие https://learn.microsoft.com/ru-ru/cpp/c ... w=msvc-170 ?


 

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 раз.

 

Member
Статус: Не в сети
Регистрация: 30.07.2021
Toxa-134 писал(а):
Это не так и причина в другом: дело в OS и разрядности компиляторов.

ОС и компиляторы ориентируются на железо. Процессор читает и пишет большими кусками. В этом проблема старых умных академических книжек с алгоритмами. Там по крупицам экономили память. Но для современного железа эти алготмы плохо подходят. Сейчас проще гигабайтные матрицы на GPU перемножать, чем байтики перекладывать.


 

Member
Статус: Не в сети
Регистрация: 28.07.2019
Откуда: Новосибирск
Фото: 13
Кто может помочь зарегистрировать новую учетку на linkedin? Чего только не пробовал, капчу нереально пройти.

_________________
Ryzen 7 9800X3D
MSI X670E GAMING PLUS WIFI
Palit RTX 5080 GamingPro
DDR5 32GB 6400MHz
PHANTEKS AMP GH, 1000W, 80+ Platinum
Fractal Design MESHIFY 2
Gigabyte M34WQ


 

Member
Статус: Не в сети
Регистрация: 27.02.2009
Откуда: Новосибирск
HskR писал(а):
ОС и компиляторы ориентируются на железо. Процессор читает и пишет большими кусками. В этом проблема старых умных академических книжек с алгоритмами. Там по крупицам экономили память. Но для современного железа эти алготмы плохо подходят. Сейчас проще гигабайтные матрицы на GPU перемножать, чем байтики перекладывать.

Наверное, именно поэтому основное нововведение RTX 50 это FP4? Который как раз маленький и сделан для этих самых быстрых вычислений на GPU.


 

Member
Статус: Не в сети
Регистрация: 30.07.2021
Toxa-134 писал(а):
Наверное, именно поэтому основное нововведение 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 можно было получить инверсный текст.

_________________
Для увеличения производительности РС нужны только три вещи....


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 52097 • Страница 2605 из 2605<  1 ... 2601  2602  2603  2604  2605
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan