• Генератор случайных чисел ИНОГДА (очень редко!) возвращает NaN?

    adeshere
    @adeshere Автор вопроса
    РАН, Фортран, временные ряды
    Спустя полтора года, завеса тайны все-таки начала спадать!
    Во-первых, благодаря вот этому совету Дмитрия Чернова, баг удалось локализовать. А именно, Дмитрий предположил, что проблему надо искать в контексте x87 FPU, и что добавление
    пары asm- команд
    Прямую вставку asm- команд в код мой фортран-компилятор не умеет, но все необходимое делает ключ Qfp-stack-check
    в подозрительных местах приведет к вылету программы по Access Violation именно в том месте, где что-то пошло не так. А не спустя какое-то время, когда я снова полезу в FPU и получу Nan, например, в ГСЧ. Эта идея сработала, и я получил Access Violation в совершенно безопасной (как мне казалось)
    функции
    SUBROUTINE SCREEN_PUTL0_TIME(TEXT)
    USE ABD_INC;  USE HEADERS
    character, intent(in) :: text*(*)
    integer*4, save :: isw=0
    c
    c     При самом первом вызове таймера isw=0, функция вернет 0
    c     При последующих (isw=1) - вернет интервал от момента инициализации
    t=timer_mm(5,isw) 
    isw=1
    if (t < $Screen_counter_time) return
    c    В крайнем  случае (если в момент начала внешнего цикла таймер уже
    c    инициализирован) функция первый раз напечатает % сразу при старте,
    c    а не через $Screen_counter_time после запуска цикла
    c   
       call screen_putl0(text)
       t=timer_mm(5,0)         ! Реинициализация таймера после печати строки
    end

    Эта функция печатает на экран % выполнения (он передается в строке TEXT), но с интервалом не менее $Screen_counter_time. Для проверки времени, прошедшего с прошлой печати, вызывается самодельный таймер t=timer_mm(5,isw) Первый параметр функции - это номер таймера (их там у меня целый массив для разных нужд). А второй параметр работает так: если isw=0, то таймер засекает время, а в остальных случаях возвращает число секунд, прошедших с момента инициализации счетчика. Ну вот так было когда-то сделано, чтобы обойтись одной функцией вместо двух....
    Таким образом, когда я дергаю инициализацию таймера, то его возвращаемое значение меня не интересует. Именно это и происходит в предпоследней строке кода выше:
    t=timer_mm(5,0)
    Результат выполнения функции как бы присваивается переменной t, но больше она нигде не используется . Как оказалось, именно здесь и была зарыта собака.

    А дальше уже было проще. В коде под спойлером у меня есть вызов функции типа real*4, от которого мне был нужен только побочный эффект (инициализация таймера), а вот возвращаемое значение функции нигде не используется. В принципе,
    это легально
    По идее, компилятор в такой ситуации должен после вызова функции восстановить стек x87 FPU, а возвращаемое значение никуда не копировать. В других местах кода у меня есть аналогичные вызовы (когда возвращаемое значение не используется), и это не приводит к каким-то багам. Ну и язык официально нигде не требует, чтобы возвращаемое значение функции обязательно было куда-то использовано ;-)

    Но как оказалось, именно это и провоцировало проблему. Этот фрагмент библиотеки у меня состоит из кучи очень небольших (5-10 строк) взаимосвязанных функций с частично повторяющимся кодом. Оптимизатор делал из них жуткое спагетти, дробя эти функции на еще более мелкие фрагменты и инлайня их направо и налево. И, видимо, где-то в ходе этих оптимизаций он "забывал" восстановить (очистить?) стек FPU.

    В общем, для исправления бага оказалось достаточно заменить локальную переменную t на глобальную. Про нее оптимизатор не знает - будет ли она нужна, или нет. Поэтому он просто вынужден извлекать из сопроцессора результат FP-вычисления, чтобы запихнуть его в это место ;-)

    Огромное спасибо Дмитрию, который сначала выдвинул правильную версию происхождения бага, а потом помог его точно локализовать и убрать! Тестовая программа работает уже час и пока ни одного Nan-а не появилось. ;-)
    Ответ написан
    Комментировать
  • C#. Есть два массива, как сделать проверку данных на совпадение?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Я вас не понял но держите, что то подойдет именно вам
    array2.Except(array1)
    array1.Except(array2)
    array1.Intersect(array2) // видимо это
    Ответ написан
    3 комментария
  • Эффективно ли решать системы дифференциальных уравнений с помощью нейронных сетей?

    mindtester
    @mindtester
    http://iczin.su/hexagram_48
    После обучения настала пора посмотреть, на что способна нейросеть. Учёные испытали её на 5000 уравнений, уже без готовых ответов (ни одно из них, правда, нельзя было отнести к «нерешаемым»). Нейросеть отлично справилась с задачей, и нашла правильные решения для большинства из них. Особенно хорошо ей удавалось интегрирование, она решила почти 100% из таких испытательных задач, но немного хуже справилась с обычным дифференцированием.
    https://habr.com/ru/post/506722/
    Как понять, что нейросеть решит вашу проблему. Пра...
    Ответ написан
    3 комментария
  • Возможно ли закодировать некоторое количество цифр в меньшее?

    Lynn
    @Lynn
    nginx, js, css
    Есть такая наука — математика.
    Она говорит, что нельзя взаимно-однозначно отобразить 10^11 значений в 10^9.
    Ответ написан
    1 комментарий
  • Как создать combobox с кастомными шрифтами в коде?

    @Sumor
    Берёте список FontFamily и присваиваете в Source ComboBox.
    <ComboBox>
      <ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock FontFamily="{Binding}" Text="{Binding Name}" />
        <DataTemplate>
      </ComboBox.ItemTemplate>
    </ComboBox>
    Ответ написан
    Комментировать
  • С чего начать учить математику?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Так школьные учебники берите и вперед.
    Не забывайте, что в математике также как и в программировании, важно не только читать, а и выполнять практические задачи - сидеть и решать. Чтобы у вас во время механической работы мозг создал нужные связи для понимания прочитанного.
    Ответ написан
    1 комментарий
  • Зачем писать такой большой код?

    alexyat
    @alexyat
    iOS Developer
    Все зависит от ситуации - метод решает какую-то отдельную задачу, разделение на методы нужно для того чтобы не повторять один и тот же код, а просто вызвать готовый метод. Позволяет структурировать код. Избегать ошибок - вы решили немного поменять код и не нужно лезть и искать по всему проекту, где вы его использовали, просто исправляете метод. В вашем случаи, если вы не собираетесь вызывать те методы из других функций, то можно все совместить в одной.
    Ответ написан
    3 комментария
  • Почему Dictionary не видит ключ?

    Беда в том, что нужно читать теорию. примеры
    Не задан comparer и не переопределен equals(t) и equals (gethashcode)
    Словарь сортирует по умолчанию,по умолчанию все ini объекты разные, если являются разными ссылками
    Ответ написан
    Комментировать
  • Куда пойти учиться на программиста после 9-го класса?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Идите на вышку.
    На программиста учатся самостоятельно. Вам нужно учиться учиться. Учиться организовываться. Учиться работать с преподавателями, с информацией, которая вам неприятна и возможно не нужна - но на любой работе это будет встречаться, а полезно уметь с этим справляться.

    Из полезного, что можно получиьт на вышке - общая грамотность, математика, алгоритмы, английский, общее образование, которое позволит вам понимать как работает живой мир (а не идеальный компьютер).
    В общем не воспринимайте образование исключительно как умение программировать - расширяйте кругозор.
    А программированию учитесь самостоятельно. Большая вероятность в вузе найти соумышленников для разработки своего проекта. Может быть на кафедре, может отдельно.
    Ответ написан
    1 комментарий
  • Полезно ли знание Pascal?

    Давай определимся.
    В школах и ВУЗах учат не Паскаль, а его диалект, Borland/Турбо Паскаль или же Delphi.

    Что изучают на Паскале? Да базовые вещи: структуры данных, алгоритмы (вычисления, линейную алгебру, графы), работу с файлами. Их знать нужно? Риторический вопрос. Это ведь основа, без которой дальнейшее обучение программированию бесполезно.

    Что плохого в курсах обучения на Турбо Паскале (ТП)?
    Пожалуй, то, что ТП работает в ДОСе. И это накладывает различные ограничения на целевое применение программ, написанных в ТП. Можно запускать ДОС программы и в Windows, но, с другой стороны, во многих школах и ВУЗах стоит устаревшее оборудование. В сёлах, поди, кроме установленного ДОСа, порой, ничего и не может быть запущено. Ну, может, порой Windows 95/98. А как учить чему-то современному в таких условиях? Вот поэтому ТП и является хорошим решением. Вместо ТП можно было бы обучать на современном Free Pascal'е.

    Самое плохое в программах, написанных на ТП, это то, что в них смешаны логика и отображение.
    Что такое MVC многие преподаватели не знают. А студентам нужно просто пройти курс и забыть. Ибо большинство или лентяи или нет у них достойного преподавателя, чтобы сделать урок интересным. А это накладывает отпечаток на дальнейшее отношение к Паскалю, как таковому. Я полагаю, что язык Паскаль выступает в данном случае козлом отпущения, хотя вины языка здесь нет, так как сам язык и простой и, в то же время, эффективный. Особенно что касается простоты отладки.

    Вот некоторые цитаты про изучение Паскаля:
    Математику тоже незачем изучать, интегралы всякие. Кому они по жизни нужны?
    Лучше бухгалтерию. История, литература - фтопку. Надо менеджмент усваивать, руководить.
    Русский язык? Зачем? Раз человек умеет читать и писать.. и ладно. Накрайняк, если не умеет писать, но умеет подписываться, значить, годен быть начальником.

    Язык невозбранно привлекает возможностью писать почти как на обычном английском языке, а не ломать голову и пальцы о ++i + ++i, эзотерику истинности выражений (1/3 == 0) и (-1 > (unsigned int) 1) и прочих извращенных приёмов, принятых в C-подобных языках.


    У языка Паскаль есть потомки: Modula-2, Delphi, Component Pascal (ранее Oberon/L), Zonnon, Active Oberon.
    У последнего вообще, довольно интересные сегодня особенности, о которых стоит почитать в статьях
    Оберон умер, да здравствует Оберон! часть I
    часть II

    В итоге каждый решает для себя, нужны ли ему положительные качества Паскаля или же, порой, мнимая власть, предоставляемая другими языками. С некоторыми языками нужно бороться определёнными средствами.
    Например, в серии статей, одна из которых Проверка Wine: Год спустя
    Ответ написан
    3 комментария
  • С каких книг/сайтов начать обучение, чтобы стать программистом за один год и работать в США? Выиграл Green Card?

    @andymitrich
    Software Developer
    [sarcasm]Да-да, сразу с ООП... хотя нет, лучше копнуть глубже и начать заучивать паттерны проектирования... и желательно на C++[/sarcasm]
    Ответ написан
    Комментировать