View in Telegram
Кстати про технические сложности Вспомнился старый кейс, где я вовсю ощутил свой недостаток образования в Computer Science. В далеком кризисе 2014 года меня приютила одна по доброте душевной (а там правда очень классные люди) компания, которая разрабатывала софт для нефтяной сейсмики. У Яндекса там была существенная доля и хорошее отношение – которое выражалось, например в том что компания называлась Яндекс.Терра, а сотрудники могли быть слушателями ШАД. Разработка на C/ С++ это вот ни разу не python или Matlab (мой основной иснтрумент тогда), и я в нее не умел (о чем честно сказал на входе). А задачи были – писать модули для той большой системы, и на старте мне дали достаточно простые – одноканальная обработка сигналов, всякие фильтрации/свертки, немного со спектрами и кепстрами. И как-то мне нужно было пройтись по спектру с шагом 0.1 Гц, что-то сделать, а затем к результату применить обратное Фурье. Только вот не всегда результат обратного преобразования Фурье будет вещественнозначным ) Поэтому делать надо было аккуратно, с первого раза в C не получилось. Списав все на свои кривые руки, решил сделать в матлабе. И там волшебным образом все заработало! Несколько дней я потратил, пытаясь добиться того же результата в C – без шанса 🙈🤯. В матлабе же не только индексация массивов отличается) В итоге пошел на поклон к синьору и тут вскрылся мой недостаток образования на тот момент в CS. Что-то о свойствах вещественных чисел я знал (что на равенство сравнивать нельзя, ибо хранятся они в некотором приближении), но вот глубоко не копал – на чем и погорел. В чем же была проблема? Как это выглядело в Matlab:
d = 0;
for i = 1:10000
    d = d + 0.1;
end
fprintf('%.25f', d)
>>> 1000.0000000001588205122970976
Аналогично на python:
d = 0
for i in range(10_000):
    d += 0.1
print(d)
>>> 1000.0000000001588
И вот то же самое (на самом деле нет) на C:
  
   float d = 0;
   for (int i = 0; i < 10000; ++i)
   {
       d += 0.1;
   }
   printf("%.6f", d);
>>> 999.902893
Дело было в том что 0.1 в двоичном виде непредставима как конечная дробь, только как периодическая. А с ограничением точности (float против double, который по умолчанию в python) при суммировании ошибка накопилась и достигла настолько существенных величин, что обратное Фурье становилось комплексным 😱. PS как-то у коллеги видел очень похожую ситуацию в python (только там он при чтении из файла во float сохранил), уже в 16м, подсказал – помогло. А копать с тех пор стараюсь поглубже 🪆
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Find friends or serious relationships easily