Новый инструмент «Herbie» автоматически переписывает арифметические выражения, чтобы минимизировать потери от округлений чисел с плавающей точкой
4К открытий4К показов
Код, который работает с числами с плавающей точкой, может выглядеть вполне правильным, но тем не менее производить некорректные вычисления из-за ошибок округления. Вашингтонский университет предлагает решение — Herbie — инструмент для автоматического исправления подобных проблем.
Herbie использует некоторые техники численного анализа и сам понимает, какие изменения лучше применить, чтобы получить лучший код, не требуя от пользователя никаких специальных дополнительных знаний.
Проверить работу можно в онлайн-демо, однако после выхода статьи он очень перегружен и ждать надо будет довольно долго. Другой вариант — установить его себе на компьютер. Мы подготовили для вас инструкцию, как это сделать:
- Сначала скачиваем и устанавливаем Racket — язык программирования семейства Lisp/Scheme, на котором создан Herbie.
- Затем забираем с GitHub сам Herbie (либо скачав ZIP, либо выполнив
git clone https://github.com/uwplse/herbie
). - Опционально можно запустить проверку на тестовых выражениях (занимает порядка 15 минут). Для этого запускаем
racket herbie/reports/run.rkt bench/hamming/
. В случае с Windows нужно найти путь к Racket.exe (папка, куда вы его установили) и передать ему в качестве параметров путь к run.rkt из только что скачанного архива Herbie и к bench/hamming/ — директории с тестами. Если получили результат 24/28 или больше, то значит, что всё хорошо. В противном случае курите мануалы. - Компилируем Herbie, чтобы работать с ним быстрее:
raco make herbie/report/run.rkt
. - Готово, можно запускать на своих выражениях.
Для примера откройте файл bench/tutorial.rkt
. В нём есть несколько тестовых выражений, по которым можно понять синтаксис заданий для Herbie. Можете оставить всё как есть или дополнить файл своими примерами. Затем запустить: racket herbie/reports/run.rkt bench/tutorial.rkt
. После вычислений появится директория graphs, откройте в ней report.html, он будет выглядеть приблизительно вот так:
Можно нажимать на more и смотреть детальные пояснения и результаты по каждому выражению, например:
Видно, что Herbie смог раскрыть скобки и преобразовать (x+1)2−1
к x⋅(x+2)
. Более детальное объяснение можно посмотреть в официальном туториале.
Инструмент постоянно улучшается, команда разработки проверяет его на выборке из 28 тестовых случаев из книги «Numerical Methods for Scientists and Engineer» Ричарда Хэмминга и демонстрирует прогресс на главной странице проекта. Сообщается также, что Herbie помог сделать множество патчей для известной библиотеки math.js, а также с ним написан плагин для Haskell, автоматически проводящий улучшения там, где это возможно.
4К открытий4К показов