Библиотека С# С++
10.1K subscribers
198 photos
13 videos
179 files
195 links
https://t.iss.one/+WgGTjeH0p1NjMDFi - ссылка на канал
По всем вопросам- @workakkk

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci- C# академия

@pythonlbooks- python книги📚

РКН: clck.ru/3Fmvsw
Download Telegram
## C++ enum class: безопасно, но местами раздражает

enum class даёт строгую типизацию и не позволяет случайно смешивать значения с обычными числами.

Но есть нюанс: даже если enum используется как набор флагов,


Flags::Read | Flags::Write


не скомпилируется.

Для |, &, ^, ~ придётся вручную определить операторы и приводить значения к базовому типу.

Это правильное поведение с точки зрения type safety, но бойлерплейта становится заметно больше.

Поэтому в некоторых C++-проектах для битовых флагов до сих пор используют обычный enum внутри namespace: меньше защиты, зато код значительно проще.
👍42🔥2
Четыре строки делают сложение `float` заметно точнее

При последовательном сложении чисел с плавающей точкой часть младших битов теряется из-за округления. На больших массивах эта ошибка постепенно накапливается.

Алгоритм Кэхэна хранит потерянную часть в отдельной переменной и компенсирует её на следующем шаге:


float kahanSum(const float *nums, int count)
{
float sum = 0.0f;
float correction = 0.0f;

for (int i = 0; i < count; ++i)
{
float adjusted = nums[i] - correction;
float next = sum + adjusted;

correction = (next - sum) - adjusted;
sum = next;
}

return sum;
}


Здесь correction запоминает ошибку округления, которая потерялась при предыдущем сложении.

Обычная сумма быстрее, но Kahan Summation полезен там, где важна численная точность:

- научные расчёты;
- статистика и аналитика;
- графика и симуляции;
- обработка больших массивов;
- накопление очень маленьких значений рядом с большими.

Метод предложил Уильям Кэхэн в 1965 году. Небольшое усложнение цикла может заметно уменьшить ошибку без перехода на более тяжёлый числовой тип.
👍112
🧠 Алгоритм, который превращает выражение в форму, где приоритеты операторов больше не нужны

Алгоритм сортировочной станции Дейкстры получил название в честь железнодорожной сортировочной станции - и работает очень похоже.

Он преобразует обычную инфиксную запись:

3 + 4 * 2

в постфиксную:

3 4 2 * +

После этого калькулятору уже не нужно каждый раз разбираться с приоритетами операторов и строить полноценное AST.

Как работает идея:

- один стек хранит операторы;
- второй поток формирует результат;
- операторы с более высоким приоритетом выходят раньше;
- скобки и ассоциативность обрабатываются по правилам стека.

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

Простой, старый и до сих пор очень красивый алгоритм для парсеров, калькуляторов и компиляторов.

#Algorithms #C #Programming #Compilers #ComputerScience
1