Saturday, February 26, 2011

Ruby: пообезьянничаем? ;-)

В некоторых, так скажем, «математико-ориентированных» языках программирования операции над векторами реализуются довольно компактным образом. В качестве примеров таких языков можно привести J и R.

В R вектор создаётся функцией c — это сокращение от 'concatenate'. Поскольку создание вектора — весьма частое явление, сократили название до предела. Компактность операций заключается в следующем:
> c(1, 2, 3) ** 3
[1]  1  8 27
> c(1, 2, 3) * c(5, 3, 1)
[1] 5 6 3 
> log10(c(1, 10, 100, 1000))
[1] 0 1 2 3

Думаю, идея ясна.

Можно ли что-нибудь подобное реализовать в Ruby? Запросто! Чтобы вышеприведённые примеры работали, потребуется всего-то порядка 30 строк кода.

Wednesday, February 23, 2011

/0.

Иногда бывает удобно вернуть из функции значение +\infty или -\infty. Это бывает проще, чем обёртывать вызов функции всяческими предпроверками. Пример: пересечение пары прямых на плоскости. В случае деления на ноль (если по формулам Крамера считать) просто получится точка с как минимум одной «ненормальной» координатой. А потом можно и проверить точку на финитность — нужно только знать, как. (В реальности, конечно, есть ещё и ошибки округления...)

Так вот, в C/C++ за работу с бесконечностями и нечислами (например, sqrt(-1.0)) отвечает <math.h>. В нём определены «константы» INFINITY и NAN (на самом деле это макросы, но кого это волнует?), а также горстка полезных «функций» (тоже макросы): isfinite, isnan, isinf, signbit. Всё это работает только для чисел с плавающей запятой.

Первые две функции проверяют аргумент на конечность и «NaN»-овость соответственно. isinf возвращает -1, 0 или 1 (потому как у бесконечности есть знак).

signbit возвращает ненулевое значение в случае отрицательности аргумента. Это может показаться странным: почему бы просто не сравнить аргумент с нулём? Дело в том, что у нуля тоже есть знак. (Правда, я понятия не имею, где это может пригодиться.) То есть signbit(1.0 / INFINITY) вернёт ноль, а signbit(1.0 / -INFINITY) — что-то иное.

(Что-то какой-то неоконченностью отдаёт. Ну и хоен с ним.)