s4ekotilla | 129 |
VANISH | 111 |
Дизель | 52 |
StratoLifter | 41 |
Bagaiev | 39 |
Цитата (valeg @ 16.07.21)это если торговый симулятор написан через жопу, и их начинал писать индус из собеса автора, все грамотные симуляторы для работы с деньгами используют fixed point
Напиши пожалуйста пример грамотного подхода. Допустим, приходят данные по стакану в текстовом виде. Точность 6 знаков после запятой. Нам надо поставить ордер на покупку на 0.5% ниже какой-то средней цены. Сам принцип интересует.
ну конкретно тут можно в double переложить и умножить на .95 и поставить ордер, у тебя уже биржа посчитает остаток правильный, а там под капотом fixed point
Цитата (flek @ 16.07.21)Интересная статья на хабре про собеседования – https://habr.com/ru/post/534902/
Больше всего меня удивил момент, где они дают программисту на тестовом периоде делать задания, которые уже сделаны :thinking:
Избыточные задания
Хоть период и тестовый, но сразу никто кандидата на реальный проект не бросает - а делаем мы вот что. У нас есть пара реальных и уже решённых задач (то есть с точки зрения реальной работы в них нет смысла) - но всё равно даём их кандидату. Эти задачи
1) опять же выявляют способности кандидата в некоторых специфических областях;
2) позволяют сравнить кандидата; так как все в компании прошли через эти задачи, можно считать эти задачи эталонными и использовать для сравнения членов команды: кто быстрее, у кого лучше скиллы и так далее (это кстати популярная тема - дать одно задание разным разрабам и смотреть как каждый будет решать его)
Опять же, напомню, что хоть эти решения ни на что не влияют, компания за них платит реальную зарплату и идёт в минус. Для нас это всё ещё рекрутинг, но с точки зрения кандидата он уже отбил всё время, потраченное на все этапы, и вполне себе нормально зарабатывает.
Он описывает стандартный процесс тестирования на многих удалённых галерах.
"Избыточные задания" - это тоже стандартная практика компаний где есть буткемпы. Гугл тоже такое пробовал.
А вот умалчивает он (или ещё не понял), что такой хайринг полное говно. Такие задания хакаются как орешки. Индусы даже пилят сайты на которых предлагают за вас пройти, решения и т.п. Текучка у таких компаний дикая. Буткемп он описывает как манну небесную для кандидатов, на деле же половина сами уходят в его процессе.
Пишу сейчас бота на Бинанс. У вот нужно мне определить, когда позиция изменится (откроется какой-то ордер). Есть проверка типа
if OldPosition = NewPosition then // делаем что-то
Тип real и предварительно размер лота округляется до нужной точности.
Так вот работает все вроде нормально, но иногда (пару раз в день) не нормально. Как же я намучился пытаясь найти в чем проблема. Оказывается
0.001 = 0.001 не всегда true (хотя в логах я вижу одинаковые значения, но они для компа не равные).
Пришлось для всех вещественных типов вместо проверки на равенство менять на IsZero(OldPos - NewPos).
Ну да, по идее сравнения даблов друг с другом надо делать через сравнение их разности с каким-то порогом, типа мы считаем что А и B равны только если А - B < 0.0001 (ну или другой предел, важно что не сравнение с 0)
Galax, дожили, что не можете сидеть на Жапе ровно.
Я не понимаю - это какой-то программистский жаргон?
Мой посыл был в том, что я раньше не сталкивался с подобной проблемой и я не мог даже предположить, что проблема может быть в такой безобидной строчке кода. Проблема усугублялась тем, что в программе делалось множество асинхронных REST-запросов на биржу, и логика программы происходила в цикле таймера, и поэтому стандартными способами оттрассировать код не получалось (тем более ошибка возникала довольно редко).
Я когда пытался разобраться, то машинально пропускал эту строчку кода, так как был уверен, что там одинаковые вещественные числа.
Возможно этот пост поможет кому-то избежать подобной ошибки. Когда ты уже осознал в чем проблема, то исправить ее не трудно, а вот на обнаружение этой проблемы я потратил кучу времени.
Используй логи, выводи print проблемных мест а потом долго в них смотри) все легче, чем по коду ошибку искать
Цитата (valeg @ 16.07.21)ну конкретно тут можно в double переложить и умножить на .95 и поставить ордер, у тебя уже биржа посчитает остаток правильный, а там под капотом fixed point
Ну то есть ты даже простое умножение не можешь выполнить в fixed point. А что ты будешь делать, если нужно будет выполнить какие-то сложные вычисления с набором произвольных математических функций, которые в частности могут возвращать значения в диапазоне [0, 1].
Цитата (Galax @ 16.07.21)Пришлось для всех вещественных типов вместо проверки на равенство менять на IsZero(OldPos - NewPos).
Цитата (strkk @ 16.07.21)типа мы считаем что А и B равны только если А - B < 0.0001 (ну или другой предел, важно что не сравнение с 0)
На всякий случай еще добавлю, что проверка абсолютного отклонения ( abs(x- y) < eps ) не работает при очень больших x, y. Поэтому для больших значений используется относительная проверка:
double max_xy = max( abs(x) , abs(y) ) ;
abs(x - y) < eps * max_xy
Но она в свою очередь не работает при маленьких значениях (< 1). Чтобы учесть оба случая можно использовать комбинированный подход:
double max_xy1 = max( { 1.0, abs(x) ,abs(y) } ) ;
abs(x - y) < eps * max_xy1
Ну или сделать две разные функции для абсолютной и относительной проверки, если нужны разные eps.
Цитата (Test2 @ 17.07.21)Galax, это не лично на твой счет, а как пример. "я не мог даже предположить, что проблема может быть в такой безобидной строчке кода." С 1981 работаю на ассемблерах, но не яростно. Даже в них (хотя простейшие же) столько ошибок, что удивляет как еще пока хоть как-то работают современные компиляторы языков высокого уровня, но уже не ровно.)))
У меня такое ощущение, что ты и на русском пишешь как на ассемблере.
Это старая очень известная штука, считай "азбучная истина". На всех языках, никогда не сравнивайте на равенство не целые числа.
Задайте интересующую вас точность, например e = 10e-8, и тогда сравнение на "равенство" чисел a и b, будет таким:
abs(a-b) < e
Для точных вычислений всегда используются целые числа. Например, приведу пример на js. вам надо точно умножить 2 числа "1.324233" и "2.23423". То формула примерно такая,
let a = 1.23232323
let b = 2.23232323
То берем:
a = a * Math.pow(10,18)
b = b * Math.pow(10,18)
дальше:
let c = a*b/Math.pow(10,18)
Сравнение так же лучше делать в целых числах...
spirit83, так для справки в js и так работает. (Почему объяснять не вижу смысла). Можешь проверить... Я привел лишь пример. Поставь например 1.2 и 2.2. Сделай сложение посмотри результат.
Цитата (CryptoDev @ 03.08.21)spirit83, так для справки в js и так работает. (Почему объяснять не вижу смысла). Можешь проверить... Я привел лишь пример. Поставь например 1.2 и 2.2. Сделай сложение посмотри результат.
Что именно работает? И почему ты предлагаешь считать по этой формуле? Ты берешь число типа double умножаешь на Math.pow(10,18) у тебя получается число типа double. Тут же нет увеличения точности. Как было произведение даблов так и осталось. Можно перемножить сразу без лишних действий.
ну камон, теперь будете 10 страниц обсуждать, как числа в каждом из популярных яп перемножать и складывать нужно?!
strkk, что-нибудь слышно по новым предложениям? как вообще относишься к предложениям от крупных аутсорс компаний типа luxoft, epam (знаю, что работал там уже, не нашел сходу пример похожего чего-то) etc: если норм оффер, то колл или уже начинает играть и репутация самой компании, стек, позиция и проч?
Цитата (Pivot_Pointer @ 03.08.21)ну камон, теперь будете 10 страниц обсуждать, как числа в каждом из популярных яп перемножать и складывать нужно?!
Да не причем тут разные языки, не об этом речь. Везде стандартные типы примерно одинаковые. Но согласен, что тема действительно специфическая и наверное пора закругляться с ней.
spirit83, В js это будет Number, который не имея дробной части будет интерплетирован как int.
Вся эта фигня с плавающей точкой происходит изза специфики хранения double в памяти... И что бы её обойти тебе нужно избавится от дробной части. Если типизированный язык, умножение и конвертация в int. В динамическом просто умножение.
Тип тут не причем, замени целый тип на любой другой. Целый взят для примера.
Системы бывают разные, цели разные и типы используются тоже разные.
Да обычно используется long 64-битный.