Новый инструмент «Herbie» автоматически переписывает арифметические выражения, чтобы минимизировать потери от округлений чисел с плавающей точкой

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

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

Проверить работу можно в онлайн-демо, однако после выхода статьи он очень перегружен и ждать надо будет довольно долго. Другой вариант — установить его себе на компьютер. Мы подготовили для вас инструкцию, как это сделать:

  1. Сначала скачиваем и устанавливаем Racket — язык программирования семейства Lisp/Scheme, на котором создан Herbie.
  2. Затем забираем с GitHub сам Herbie (либо скачав ZIP, либо выполнив git clone https://github.com/uwplse/herbie).
  3. Опционально можно запустить проверку на тестовых выражениях (занимает порядка 15 минут). Для этого запускаем racket herbie/reports/run.rkt bench/hamming/. В случае с Windows нужно найти путь к Racket.exe (папка, куда вы его установили) и передать ему в качестве параметров путь к run.rkt из только что скачанного архива Herbie и к bench/hamming/ — директории с тестами. Если получили результат 24/28 или больше, то значит, что всё хорошо. В противном случае курите мануалы.
  4. Компилируем Herbie, чтобы работать с ним быстрее: raco make herbie/report/run.rkt.
  5. Готово, можно запускать на своих выражениях.

Для примера откройте файл bench/tutorial.rkt. В нём есть несколько тестовых выражений, по которым можно понять синтаксис заданий для Herbie. Можете оставить всё как есть или дополнить файл своими примерами. Затем запустить: racket herbie/reports/run.rkt bench/tutorial.rkt. После вычислений появится директория graphs, откройте в ней report.html, он будет выглядеть приблизительно вот так:

herbie-1

Можно нажимать на more и смотреть детальные пояснения и результаты по каждому выражению, например:

herbie-2

Видно, что Herbie смог раскрыть скобки и преобразовать (x+1)2−1 к x⋅(x+2). Более детальное объяснение можно посмотреть в официальном туториале.

Инструмент постоянно улучшается, команда разработки проверяет его на выборке из 28 тестовых случаев из книги «Numerical Methods for Scientists and Engineer» Ричарда Хэмминга и демонстрирует прогресс на главной странице проекта. Сообщается также, что Herbie помог сделать множество патчей для известной библиотеки math.js, а также с ним написан плагин для Haskell, автоматически проводящий улучшения там, где это возможно.

Типичный программист