Франк Форс у себя в блоге разобрал эффект 3D-тоннеля, код которого умещается в 140 символов, — "Dissecting A Dweet #8: Shattered Tunnel".
Этот эффект — идейное продолжение демо "Strange Сrystals", которое в 2013 году заняло первое место на конкурсе JS1k (соревнование среди демок, которые умещаются в 1024 байт). Из статьи узнал, что
Статья интересная. Рекомендую почитать, если интересуетесь графикой и code golf.
#graphics #math #js
http://frankforce.com/?p=7160
Этот эффект — идейное продолжение демо "Strange Сrystals", которое в 2013 году заняло первое место на конкурсе JS1k (соревнование среди демок, которые умещаются в 1024 байт). Из статьи узнал, что
canvas.width = canvas.width
используют для очистки canvas. Этот хак работает благодаря тому, что при присваивании любого значения размера canvas, происходит его инвалидация. В конкурсах, подобных JS1k, этот код сокращают до canvas.width |= 0
, но этот хак не рекомендуют использовать в серьёзных проектах.Статья интересная. Рекомендую почитать, если интересуетесь графикой и code golf.
#graphics #math #js
http://frankforce.com/?p=7160
Killed By A Pixel
Dissecting A Dweet #8: Shattered Tunnel
Howdy, folks! Today we will be looking at the JavaScript code behind this amazing 3D tunnel effect. This code has an interesting lineage so we’ll also talk about some of the history behind it…
Том МакРайт — разработчик Mapbox и OpenStreetMap — недавно опубликовал статью про отличия реализаций математических функций в JavaScript-движках — "Math keeps changing".
Однажды Том столкнулся с падающими тестами в своей библиотеке для работы со статистическими функциями. Тесты падали в 12-ой версии Node, в 10-ой всё было ок. Его это заинтересовало, и он пошёл смотреть реализации движков и читать спецификацию.
В спецификации ECMAScript сказано, что в ней нет точного описания поведения математических функций (sin, cos, exp, pow, random, sqrt и т,п,). Разработчики стандарта пошли на такой шаг, чтобы в JavaScript-движках можно было использовать все преимущества нижележащей платформы, например, специфичные команды CPU для работы с тригонометрией. Именно из-за этого падали тесты Тома. Исторически V8 использовал свою собственную библиотеку для математических функций, затем использовал JavaScript-порт fdblibm, сейчас там используется C-версия fdblibm.
Для того чтобы предотвратить подобные ошибки, результат вычислений сравнивают относительно малой величины "эпсилон" —
В общем, мне статья очень понравилась. Рекомендую почитать.
P.S. Спасибо за ссылку на статью улетает Олегу Ковалёву (@oleg_log)
#js #math
https://macwright.org/2020/02/14/math-keeps-changing.html
Однажды Том столкнулся с падающими тестами в своей библиотеке для работы со статистическими функциями. Тесты падали в 12-ой версии Node, в 10-ой всё было ок. Его это заинтересовало, и он пошёл смотреть реализации движков и читать спецификацию.
В спецификации ECMAScript сказано, что в ней нет точного описания поведения математических функций (sin, cos, exp, pow, random, sqrt и т,п,). Разработчики стандарта пошли на такой шаг, чтобы в JavaScript-движках можно было использовать все преимущества нижележащей платформы, например, специфичные команды CPU для работы с тригонометрией. Именно из-за этого падали тесты Тома. Исторически V8 использовал свою собственную библиотеку для математических функций, затем использовал JavaScript-порт fdblibm, сейчас там используется C-версия fdblibm.
Для того чтобы предотвратить подобные ошибки, результат вычислений сравнивают относительно малой величины "эпсилон" —
Math.abs(result - expected) < epsilon
. Можно также использовать функции из библиотеки stdlib-js, но они работают не так быстро как их соседи из библиотек, скомилированных в нативный код.В общем, мне статья очень понравилась. Рекомендую почитать.
P.S. Спасибо за ссылку на статью улетает Олегу Ковалёву (@oleg_log)
#js #math
https://macwright.org/2020/02/14/math-keeps-changing.html
macwright.com
Math keeps changing
How the behavior of JavaScript math functions is undefined and important
Вилл Тейлор опубликовал статью про основные понятия лямбда-исчисления на примере JavaScript — "An introduction to Lambda Calculus, explained through JavaScript".
Лямбда-исчисление — это вычислительная модель, в основе которой лежат чистые функции. В статье на примерах показывается, что в ней нет ничего сложного — основные принципы счисления умещаются в несколько правил. Составные части лямбда-исчисления — переменная, абстракция, аппликация. Для вычислений используется β-редукция — по сути поэтапная замена переменных в функции конкретными значениями. В статье ещё рассказывается про каррирование, связанные и свободные переменные, α-эквивалентность, ассоциативность и приоритет.
Статья не сложная. Если интересуетесь функциональным программированием, очень рекомендую почитать.
#js #math #fp
http://willtaylor.blog/an-introduction-to-lambda-calculus-explained-through-javascript/
Лямбда-исчисление — это вычислительная модель, в основе которой лежат чистые функции. В статье на примерах показывается, что в ней нет ничего сложного — основные принципы счисления умещаются в несколько правил. Составные части лямбда-исчисления — переменная, абстракция, аппликация. Для вычислений используется β-редукция — по сути поэтапная замена переменных в функции конкретными значениями. В статье ещё рассказывается про каррирование, связанные и свободные переменные, α-эквивалентность, ассоциативность и приоритет.
Статья не сложная. Если интересуетесь функциональным программированием, очень рекомендую почитать.
#js #math #fp
http://willtaylor.blog/an-introduction-to-lambda-calculus-explained-through-javascript/
www.willtaylor.blog
An introduction to Lambda Calculus, explained through JavaScript
I have recently become very interested in functional programming - using pure functional languages such as Haskell, as well as functional programming in JavaScript. One of the main areas of study that is often cited as significant for functional programmers…
Артём Караваев на хабре написал статью о том, как складывать числа с плавающей запятой без потери точности.
Зачем это нужно. Представьте, что у вас есть большой массив чисел с плавающей запятой, и вам надо найти их сумму. Чем больше будет массив тем больше будет ошибка в вычислении из-за накопления погрешности.
Математически можно доказать, что ошибку округления сложения чисел с плавающей запятой всегда можно точно представить другим числом с плавающей запятой. То есть чтобы сложить два числа с плавающей запятой без потери точности, нужно вычислить погрешность и использовать её в других вычислениях. Найти эти числа можно так (в статье есть более точные алгоритмы поиска для разных входных значений):
Очень хорошая статья. Рекомендую почитать всем, кто заинтересовался этой темой.
#math #algorithm
https://habr.com/ru/post/523654/
Зачем это нужно. Представьте, что у вас есть большой массив чисел с плавающей запятой, и вам надо найти их сумму. Чем больше будет массив тем больше будет ошибка в вычислении из-за накопления погрешности.
Математически можно доказать, что ошибку округления сложения чисел с плавающей запятой всегда можно точно представить другим числом с плавающей запятой. То есть чтобы сложить два числа с плавающей запятой без потери точности, нужно вычислить погрешность и использовать её в других вычислениях. Найти эти числа можно так (в статье есть более точные алгоритмы поиска для разных входных значений):
s = a+b; // сумма
z = s-a;
t = b-z; // погрешность
Очень хорошая статья. Рекомендую почитать всем, кто заинтересовался этой темой.
#math #algorithm
https://habr.com/ru/post/523654/
Хабр
Сложение двух чисел с плавающей запятой без потери точности
Здравствуйте, друзья, как вы думаете, если мы напишем такой код: s = a+b; z = s-a; t = b-z; то не кажется ли вам, что в результате его выполнения получится, что t=0? С точки зрения привычной...