Есть ли идея решить проблему с плавающей точкой точности в будущем?
Мы не можем хранить десятичные числа с бесконечной точностью, но может быть какой-то способ представить их так же, как мы представляем бесконечные списки в haskell.
Первая идея пришла мне в голову - представить десятичное число с помощью чего-то похожего на Codata, чтобы для любого заданного натурального числа k мы могли вычислить десятичное число с точностью до k цифр.
Но есть некоторая очевидная проблема, подумайте о количестве a = 0.333...
а также b = 0.666...
, если мы добавим их вместе, мы получим ans = 0.999...
(последовательность цифр), но мы никогда не можем сказать, a + b == 1
в этом случае.
Я хочу как-то определить десятичное число, чтобы оно поддерживало +
, -
, *
, /
, >
, ==
операции, и ни на что +
, -
, *
, /
Операция, которую мы применили к этим десятичным числам, мы получаем новые десятичные числа, которые мы можем вычислить с точностью до k цифр, учитывая любое натуральное число k.
Я задаюсь вопросом: есть ли идея, которая может решить это?
1 ответ
Haskell предлагает Rational
, Cyclotomic
, а также CReal
для точной арифметики.
CReal
вычислимый реал приближается к представлению действительных чисел на машине настолько близко, насколько это возможно; почти любое глупое действительное число, которое вы можете придумать и описать, может быть вставлено в CReal
, Компромисс между способностью представлять так много вещей заключается в том, что ваша наблюдательность сильно ограничена. Проверка на равенство, проверка того, больше ли одно, чем другое, даже уверенность в том, какой должна быть первая цифра, являются технически неразрешимыми проблемами; хотя пакет, предоставленный на Hackage, обеспечивает алгоритмы приближения для всех этих наблюдений.
Cyclotomic
может представлять гораздо меньшую часть действительных чисел и может представлять значительную часть комплексных чисел, сохраняя при этом точное вычисление, и поддерживает гораздо больше наблюдений в решающей форме. Многое из того, что вы хотите сделать, можно сделать с помощью циклотомических чисел.
Rational
представляет все числа, которые могут быть записаны в виде дробей. Это значительно меньший кусок реала, чем CReal
или же Cyclotomic
: квадратные корни (и другие корни) практически отсутствуют, тригонометрические функции практически отсутствуют, числа pi и e отсутствуют и т. д. Но наблюдения, соответственно, более эффективны, чем для CReal
а также Cyclotomic
так что иногда они просто билет.
... конечно, если эффективность имеет значение, Double
собирается взорвать все это из воды с сегодняшним оборудованием. Тщательно выбирайте яд!