Developer's notes
33 subscribers
67 photos
4 videos
74 links
Пишу обо всём и ни о чём, могу и о программировании
Download Telegram
Целочисленное сложение 3 чисел
#IT #job #c_plus_plus #asm
Сложение 3 double
#IT #c_plus_plus #job #asm
Не надо плавать

В прошлых постах я довольно подробно расписал подводные камни работы с числами с плавающей точкой, которые моделируют дробные(рациональные) числа. И тут есть интересный момент: это не единственный вариант работы с такими числами (Википедия не даст соврать), я и сам уже упоминал это, но… в C++ их нет ни как базового типа, ни как класса в стандартной библиотеке. Зато, в C++ есть вызывающая много споров возможность перегружать операторы, что подталкивает нас попробовать создать так называемые числа с фиксированной точке “на коленке”, сделав свой класс и перегрузив (хотя бы часть) арифметических операторов.

Тут прежде, чем изливать тонны кода, давайте остановимся на основах: почему это возможно и как это сделать. Итак, язык нам предоставляет базовые integral types, обычно 1,2,4, 8 байтовые со знаком или без (ну уж точно на x86-64 платформе это так) и предоставляет нам арифметические операторы для этих типов. Рассмотрим базовые моменты работы арифметических операторов на примере типов uint8_t, int8_t:
• Сложение для uint8_t происходит по модулю 256 т.е. 1+2 = 3, но 1+255=0
• Сложение знаковых чисел происходит той же самой инструкций ассемблера, т.е. для CPU нет никаких отрицательных чисел, границы этого типа -128…+127
• Перемножение двух int8_t дает результат типа int16_t
• Частное от деления int16_t \ int8_t дает результат типа int8_t, остаток отбрасывается

А теперь основная идея (или трюк, если хотите), я могу взять переменную типа int8_t и мысленно сказать, что она хранит не целое число…а например, число четвертей, то есть мысленно поставить точку после двух левых разрядов. Давайте на примере десятичной системы: я возьму какие-то числа, например 3.14 и 2.71 и скажу – “у меня есть 314 сотых, а также 271 сотая”. Если меня попросят их сложить или вычесть это можно сделать, не выходя за нотацию сотых прямо сразу: 314 + 271 = 585, 314 – 271 = 43. Давайте попробуем умножить, 314*271 = 85094 эм...это точно в сотых? Нет, это точно не в них – правильно будет вот так 851 т.е. сдвинуть на 2 разряда вправо. А причём тут сотые, и какие-то четверти, которые я упоминал ранее? Четверти – это одни четвертые (богатый русский язык), для двоичной системы, это тоже самое, что сотые для десятичной.

В следующий раз понемногу начну показывать код.

#IT #job #c_plus_plus #math #weird #ToBeContinued
👍1🔥1
Я белыми, чаще всего бывает, что противник протупливает фигуру как здесь, и потом получается поставить мат

#flood #chess
Две странных победы: оппоненты, в обоих случаях, сами довольно осознанно сдали ладью – там не было "вилки", можно было спокойно уйти и так далее, но через несколько ходов после этого они сдались. Там где я белыми, вероятно был план "пролезть" ферзём за рокировку, но что-то пошло не так

#flood #today #chess
Не надо плавать

Часть 2

Поскольку код вышел на Хабре, и более-того, комментаторы и я сам нашли довольно большое количество ошибок и переусложненных моментов, хотелось бы тут остановиться ещё раз на идее.
В языке C++ есть типы double и float, реализованные в соответствии со стандартом IEEE-754.

Знаменитая картинка из Википедии говорит о том, что мы храним отдельно знак, степень 2ки (экспоненту), и мантиссу – считай наши двоичные цифры. Тут хочется напомнить, что целые либо беззнаковые числа хранятся абсолютно иначе: нет ни отдельно знака, ни степени, по сути, хранится только само число.

Смысл статьи на Хабре и потуг предыдущего поста состоит в том, что можно взять целое число произвольного размера (но из тех, что нативно поддерживается компилятором) и сказать, что теперь я трактую n правых разрядов как значение идущее после точки – дробную часть числа, а остальные разряды как левую часть числа, вот пример для 8 битного числа где 2 младших разряда я отдаю под дробную часть 0000 1101, это тоже самое что 11.01 (2) = 3.25 (10) .

Соответственно, написанный код – всего лишь является отражением этой идеи.

#today #IT #c_plus_plus #math #habr #ToBeContinued
👍1
Мысли в слух

По итогам публикации на Хабре в комментариях подкинули пищу для размышлений, наверное, наиболее интересная из них сделать нормальный Decimal ориентированный именно на 10тичные дроби (арифметику), в целом.

Как я уже упоминал, я делал нечто подобное на работе, но сложно то решение признать полноценным - на работу с гигантскими суммами оно не было ориентировано - ну что ж, соориентируем

#flood #today #habr
Как делить не деля

https://habr.com/ru/articles/833470/ В этот раз написание статьи оказалось даже более трудоёмким делом чем до этого – сказались объём и сложность изучаемых материалов, некоторое супер простое введение на канале напишу попозже

#today #habr #c_plus_plus
👍1
Сам попал в свою ленту

#today #flood #habr
Неожиданно, но приятно

#today #flood #habr
🔥2
Мне нравится это число, хотя две последние цифры лишние, но пока и так сойдёт

#today #habr #humor #flood
👍3
В Москве даже арбузы хотят быть в фонтане

#today #flood #humor
😁1
Как поделить не деля или оптимизация деления компиляторам(и)

Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следующий snippet:

uint8_t div10(uint8_t x)
{
return x/10;
}

https://habr.com/ru/articles/833470/

#cpp #programming

👉 @cpp_lib
Кстати, вот, обнаружилось, что мою статью форварднули в телегу и ВК, буду считать, что это хорошо

#today #flood #habr #VK
Немного о смешном: вот эта партия вышла очень забавной. Манеру оппонента лучше всего характеризуют слова: "безумие и отвага" – в своих попытках зажать меня пешками он проморгал 2 фигуры, хотя потом и смог меня подловить под рокировкой, где я не смог съесть его ладью, отыграв таким образом лёгкую фигуру. Даже проиграв ферзя, он продолжал на что-то надеяться: в итоге я решил, что мне нужно два ферзя – наконец-то после этого он сдался.

#flood #chess #today
👍1