metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-12-13 06:24 pm

Наркоманы

Все таки в хаскеле кое-где проглядывают следы неадеквата, от которого не спасает даже система типов.
Вот например, если в исходнике написать десятичный литерал, типа 1.5, то для того, чтобы он нормально скомпилировался в некий тип данных, нужно чтобы этот тип был инстансом Fractional. А Fractional - это класс чисел поддерживающих деление, что, по моему, к десятичным литералам относится весьма слабо.
Вот, к примеру, нужно мне хранить эквивалент SQL типа NUMERIC(M,N). Я использую Data.Decimal, но записать оный Data.Decimal в нормальном виде в исходнике не получается, т.к. инстансом Fractional он не является, потому что операция деления в нем реализована весьма хитро и не совместима с (/). В принципе достаточно реализовать fromRational, но там свои заморочки, например, 1.5::Rational - это 3%2, что к Decimal как бэ не сразу и преобразуешь.

PS: Дурь я эту временно обошел, методом записи в явном виде: Decimal N (число*(10^N) где N - точность числа.

[identity profile] clayrat.livejournal.com 2009-12-14 03:26 pm (UTC)(link)
чо, нету float нормального? лучше тогда сразу уже на maude писать, ввести свои числа арифметикой Пеано, потом операции - эдакий "функциональный ассемблер" =D

[identity profile] metaclass.livejournal.com 2009-12-14 05:50 pm (UTC)(link)
Сразу видно - опердень не писал. Какой флоат в финансовой арифметике, голову же оторвут за потерю точности :)

[identity profile] clayrat.livejournal.com 2009-12-14 05:51 pm (UTC)(link)
да, далек я от финансов =D
(deleted comment)

[identity profile] metaclass.livejournal.com 2009-12-14 06:52 pm (UTC)(link)
Есть множество чисел, которые выражаются в виде конечных десятичных дробей, но не выражаются в виде конечных двоичных. В результате теряется точность, а алгоритмы, используемые в бухгалтерии, таковы, что эта потеря может нарастать по мере увеличения количества операций и их детализации.
Для денег поэтому всегда используют только decimal, в виде N/(10^M), где N и M - целые числа. В дельфи, в частности, N = [-2^63..2^63-1], M=4. И то, этого не всегда хватает, приходится извращаться с дополнительными масштабными коэффициентами.

[identity profile] clayrat.livejournal.com 2009-12-15 12:38 pm (UTC)(link)
единственное, что я знаю об этой сфере - это что там пишут на таинственном языке R =D

[identity profile] kurilka.livejournal.com 2009-12-15 12:40 pm (UTC)(link)
опердени на R?

[identity profile] clayrat.livejournal.com 2009-12-15 12:56 pm (UTC)(link)
насчет R не знаю, а в молодости писал лабы по статистике на J - таки да, опердень на нем замаешься воротить =)