• Почему так работает SQL выборка из поля типа float?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Я отвечу чуть более развёрнуто.
    Дело в том, что float хранит дробные числа в двоичном формате.
    Кроме двоичных мы работаем с десятичными числами и тут возникает проблема.
    К примеру, число 1/3 (одна третья) в десятичной системе счисления будет записываться как бесконечная (периодическая) десятичная дробь 0.33333(3). А вот в троичной системе счисления это число запишется конечной троичной дробью: 0.1 (читается, как "ноль целых и одна третья").
    По такой же схеме у нас десятичное число 0.5 (ноль целых и пять десятых) равно в двоичной 0.1 (ноль целых и одна вторая). 0.25 [10] == 0.01 [2]; 0.75 [10] == 0.5 [10] + 0.25 [10] == 0.11 [2].

    А теперь, внимание, на десятичное число 0.2 (ноль целых и две десятых), для перевода в двоичную систему счисления нам нужно сложить это число из членов двоичного ряда:
    ==1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256, 1/512, 1/1024 ...
    0. 0    0    1    1     0     0   ( 1      1      0      0 )

    В круглых скобках обозначен период двоичной дроби. То есть двоичной дробью в конечном количестве знаков после двоичной запятой задать десятичное число 0.2 (ноль целых и две десятых) НЕЛЬЗЯ!

    Если у нас есть лишь конечное количество знаков, то ими представить в точности 2/10 в двоичной системе счисления одним числом невозможно.
    Чему конкретно получится равным "обрзанное" (округлённое конечно) число будет зависеть от того по какой именно двоичный разряд мы его округлили.

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

    Итак, чтобы сравнить два числа на равенство, скажем a и b, нужно выбрать некое e=0.0000001, которое будет определять точность сравнения и проверять условие: abs(a-b)<e - модуль разности сравниваемых чисел должен быть меньше выбранной точности. Если условие соблюдается, то числа считаем условно равными с заданной точностью. Если нет - не равными.

    Добавлю, что, как отметили выше, цены и денежные суммы вообще в формате с плавающей точкой хранить "плохая примета"=). Для этого есть специальные форматы, которые не создают таких сюрпризов при переводе из/в десятичную систему.
    Вот замечательная статья на хабре про это: Потеря точности из Double во Float или «Куда пропа...
    Ну и еще есть: Что нужно знать про арифметику с плавающей запятой, Наглядное объяснение чисел с плавающей запятой, Разбираемся в числах с плавающей точкой, и т.д.
    Ответ написан
    Комментировать
  • Как решить задачу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне строки - это объекты и у этих объектов есть встроенные функции (называются они "методы").
    Так вот, у строки есть такие методы:
    > '1234567'.isdigit()
    True
    > '123.45.67'.isdigit()
    False
    > '1234567'.isalpha()
    False
    > 'Smith'.isalpha()
    True

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

    Вообще сейчас выскажу довольно "капитанскую" мысль, но такие задания обычно не дают без предварительной информации как их делать. Вы видимо пренебрегли теоретической частью. То, как вы пытаетесь решить эту задачу, даже если вам удастся это, будет неправильным решением. Слышали выражение "ректальная тонзилитомия"? Могу ошибаться, но кажется это когда гланды удаляют через задницу. Вот даже если это бы удалось, делать так неправильно, а вы в своём коде именно этим, фигурально выражаясь, и занимаетесь.
    Я понимаю, что вы хотели здесь получить готовое решение с пояснениями, но это не добавит вам знания и не заменит тот теоретический курс, на который вы, видимо, забили.
    Ответ написан
    7 комментариев
  • Почему нельзя поставить минус в статье?

    Boomburum
    @Boomburum Куратор тега Хабр
    Местный
    Судя по всему, кармы достаточно — поставить минус так и не получилось? Если нет, то попробуйте перезагрузить страницу, возможно, скрипты не прогрузились. Если не получается — напишите обращение в форму обратной связи с описанием окружения, возможно, какой-то баг.
    Ответ написан
    1 комментарий
  • Как сгенерировать хэш-пароль для тора?

    Oxyd
    @Oxyd
    Linux enthusiast
    cd C:\Users\HistoryDeveloper\Desktop\Tor
    tor --hash-password MySuperPassword

    Сначала cd, потом запуск с параметрами.
    Ответ написан
  • Как стать олимпиадником с нуля?

    twobomb
    @twobomb
    Решать, решать и еще раз решать. Нужно начинать с простых задача, не нужно лезть в уровень задач университетских олимпиадников. Поищи задачи какого нибудь первого тура школьной олимпиады, где самое сложное будет "напишите программу для расчета факториала". Важный момент, нужно догонять самому. Не нужно лезть в интернет и искать готовый алгоритм и пытаться разбирать его, сначала напиши свой, какой бы то ни было алгоритм, чтобы он работал, а потом уже можешь ознакомится как это делают другие. Хотя наверное всетаки, рекомендую начать еще с дискретной математики, очень важная штука, чтобы понимать всякие там графы и другие структуры, перестановки и прочее.
    Ответ написан
    8 комментариев
  • Как стать олимпиадником с нуля?

    Anitamsk
    @Anitamsk
    Frontend Dev
    Этот вопрос вы должны были задать своему учителю математики. Вангую его ответ: "может пора заниматься математикой больше "Сидоров"?".
    Ответ написан
    1 комментарий
  • Какие области математики необходимы для электронщика?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ну, пока вы не взялись проектировать современные микропроцессоры где-нибудь в Intel или программировать железки реального времени, никакая. Нужна только физика в объёмах школьной программы.
    Ответ написан
    4 комментария
  • Бот, понимающий смысл?

    Lucian
    @Lucian
    https://t.me/MakeFreelance
    Если подход "в лоб", то делать поиск в присланном сообщении по словам, выдавать заранее готовые уточняющие вопросы, к примеру:
    - Хочу купить покемона, сколько будет стоить доставка?

    Ключевые слова: купить, покемона, сколько, стоить, доставка

    Покемон - это вещь в каталоге, значит можно показать варианты покемонов.
    Доставка - это действие, значит можно показать стоимость.

    Выдаем варианты кнопками:
    - Выбрать покемона
    - Стоимость доставки

    Если более правильно, то гуглите world2vec, тогда обученный бот уже будет понимать контекст, т.к. пример выше самый простой.

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

    Проблема 2 ваш друг сидящий рядом скажет что бот тупой т.к. на ваш вопрос, бот ответил бессмыслицу, которая понятна только вам, но не вашему другу.

    Проблема 3 это получить ответ от бота одинаково понятный вам и другу.

    Вот набросал, смотрите как это работает
    AWwZZbl.gif

    Окружающий мир и другие люди загоняют нас в рамки:
    - туда не ходи
    - здесь не трогай
    - где родился, там и пригодился
    - это не солнце, а луна
    - трава зеленого цвета, а не коричневая
    - и т.д. миллионы контекстов

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

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

    Создать такого бота, это тоже самое что вырастить ребенка, т.е. сложно, но вполне возможно.

    Начните с этого видео, чтобы понять что я имею в виду, когда говорю "создать среду".
    Ответ написан
  • Как уменьшить svg код?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Пример километрового SVG


    Это не SVG. Это обычная растровая png картинка, которую закодировали в base64 и вставили в SVG. Сжать никак не получится (ну то есть насколько вы растровую картинку сожмете?). Вам нужно эту штуку нарисовать изначально в векторе, тогда она будет маленькая и аккуратненькая.
    Ответ написан
    3 комментария
  • Как отправить бота на какой-то сайт для авторизации?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    - Так, Бендер, идешь на ютуб, представишься Васей, авторизируешся...
    - Bite my shiny metall ass, Meat Bag!
    Ответ написан
    1 комментарий
  • Как создать свою доменную зону?

    joeberetta
    @joeberetta
    Читай: https://epdf.pub/google-for-dummies.html
    Для начала надо научиться гуглить:
    https://stackoverflow.com/a/3316393/8728290
    Ответ написан
    Комментировать
  • Как создать свою доменную зону?

    Заплатить кучу денег и не факт, что icann сделают твою зону.
    Ответ написан
    Комментировать
  • Как оптимизировать функции по скорости?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    man strnstr
    man memchr

    И может быть немного почитать гугл о строковых функциях прежде чем начинать нести чушь и клепать велики? Да, и строка короче чем 0 быть не может. :)
    Ответ написан
    Комментировать
  • Как закрыть доступ к сайту и настроить инвайты?

    DevMan
    @DevMan
    да фигня вопрос - прост при регистрации спрашиваем код инвайта.
    элементарно реализуется на любом яп'е.
    Ответ написан
    2 комментария
  • Правильно ли я понимаю работу данного элемента кола (буду очень благодарен)?

    milssky
    @milssky
    Координатор племени фиолетовых обезьянок
    Да
    Ответ написан
    Комментировать
  • Как технически создать возможность для дистанционного обучение для техникума?

    alams_stoyne
    @alams_stoyne
    Full Stack Developer - #PHP #CSS #JS #DB
    Есть решения: Moodle или edX
    Ответ написан
    Комментировать
  • Как удалённо подключиться к debian 10?

    Zoominger
    @Zoominger Куратор тега Windows
    System Integrator
    Проверяйте Firewall, причём не только на роутерах, но и на самих ОС.
    Ответ написан
    Комментировать
  • Как правильно прописать критерии загрузки веб-приложения в договоре?

    2ord
    @2ord
    Быстро - понятие расплывчатое, но, в целом, по-моему, это до 2-х сек. загрузка основного контента, при котором можно уже работать комфортно.
    Хорошо разработанное веб-приложение:
    1. не "вешает" браузер
    2. имеет небольшой объем статических файлов в совокупности (такой, который позволяет получить почти весь контент за эти 2 сек.) при первом посещении
    3. имеет небольшое количество статических файлов и для этого компонует множество статических файлов в несколько файлов bundle с целью уменьшения количества обращений к серверу
    4. загружает статические файлы с серверов CDN расположенных географически близко к основной аудитории приложения
    5. имеет клиентскую часть с минимизированным обращением к серверу для обмена информации
    6. сервер отдает ответ макс. до 100 мс (в локальной сети веб-приложения). С учетом задержек сети (network latency) в реалиях мобильного интернета можно возрасти время получения ответа в разы.
    7. при длительных операциях информирует пользователя о статусе

    Нужно разделять время отдачи ответа сервером и время прохождения от сервера к клиенту.
    Ответ написан
    1 комментарий
  • Как разобраться с выделением памяти в массиве?

    bingo347
    @bingo347
    Crazy on performance...
    Если правильно понял вопрос, то можно выделить память единым куском под всю матрицу:int* matr = (int*)malloc(n * m * sizeof(int));а к конкретной ячейке обращаться как matr[i * n + j]
    тогда и освободить будет просто - free(matr) и все.

    а для текущего примера освобождение памяти будет выглядеть так:
    void free_matr(int m, int** matr) {
      for(int i = 0; i < m; i++) {
        free(matr[i]);
      }
      free(matr);
    }
    Ответ написан
    1 комментарий