-
Все мы любим double со всеми его приколами для операций с [дробными] числами. (извините, я не сумел выбрать верный термин, поэтому написал так) Когда мы пытаемся натянуть их использование на повсеместно используемые значения, представленные десятичными дробями, но получает массу весёлостей. При этом в 99% реальных случаев на самом деле входными значениями являются значения, заданные десятичной дробью, и выходные значения тоже хотим получить в виде десятичной дроби.
Собственно основная проблема double в том, что там - степени двойки, а не степени десяти хранятся.
Вопроса у меня два в связи с этим:
1) Подскажите, по каким словам загуглить готовые реализации double, который бы однозначно отображался именно на десятичное представление. Я не сумел придумать.
2) Почему мы до сих пор живём с тем double, который имеем? когда-то понятно его сделали для облегчения реализации в ЭВМ. Но сейчас, казалось бы, уже не должно быть проблемой сделать аппаратную реализацию работы с любым double. Но почему этого нет? и не видно даже каких-то подвижек? либо я плохо смотрю
ЗЫ 99% - субъективная цифра, у меня нет пруфов
-
>загуглить готовые реализации double С Double как раз нет никаких проблем. Есть проблемы с Single, да и то решаемые, а вот что не так с Double? Точность у Double даже с запасом (15 знаков в десятичной системе).
function DoubleEpsilon: Double; begin R := 1.0; while (1.0 + R / 2.0) > 1.0 do R := (R / 2.0); Result := R; //0.000000000000000222044604925031 //15 знаков КАРЛ! 15!!!! end;
-
Да и никто, заметьте, никто не мешает вам спроектировать процессор с байтом в 10-бит :) А также разработать систему команд на основе вашего нового байта. Все внимательно ждут и верят в Вас.
-
Для большинства задач привязка к десятичной системе не нужна. Нужна в финансовых расчётах, для этого есть тип Decimal. Если его возможностей не хватает, придётся, видимо, придумывать что-то своё.
-
> dmk © (27.02.19 10:32) [1] > С Double как раз нет никаких проблем. Есть проблемы с Single, > да и то решаемые, а вот что не так с Double? Точность у > Double даже с запасом (15 знаков в десятичной системе).
Это так только кажется. Уже суммы денег вполне себе близки к 15 тем самым разрядам имеют место быть на счетах банковских (особенно если хотят 4 или 6 знаков после запятой видеть), так что это только кажется, что увеличение точности что-то решает. На самом деле - совершенно ничего не решает, лишь позволяет до поры до времени закрыть глаза на проблему. Но не решает вообще ничего.
-
И проблема не в использовании степеней двойки в компьютере, а в использовании степеней десятки в быту. Именно десятка приводит к ряду чудес, которых бы не было при использовании двойки. Поэтому использовать не-двоичное представление где-то, кроме вывода на экран, едва ли оправданно.
-
>KSergey © (27.02.19 11:06) [4] Пишите модуль вычислений с длинной математикой. Алгоритмы достаточно простые. Сделайте для начала 128 бит (+, -, /, *), а там может и этого хватит пока.
-
> Для большинства задач привязка к десятичной системе не нужна. > Нужна в финансовых расчётах, для этого есть тип Decimal.
типа decimal в дельфи нет. он до сих пор не реализован (в quality central лежит соотв. тикет уже лет 20):
Наскок знаю в современных версиях дельфи все осталось так же:
> System.pas: > //varDecimal = $000E; { vt_decimal 14 } {UNSUPPORTED > as of v6.x code base}
я работаю с decimal, но сам его импортирую из oleaut32.dll типа того:
> function _VarDecAdd(var aDec1: ActiveX.TDecimal; var > aDec2: ActiveX.TDecimal; > out aDecResult: ActiveX.TDecimal): HResult; > stdcall; external 'oleaut32.dll' name 'VarDecAdd';
-
Когда мы работаем с физ. величинами и физ. расчетами - то там да, там в самом деле плавающие точки - отличная вещь. А вот когда у меня есть 1 рубль, но при этом я смогу купить только 99 колобков спичек по 1 примерно копейке, после чего деньги закончатся - то ту-то только и начнёшь понимать всю глубину проблемы.
-
А деньги не надо считать с плавающей запятой. Они же дискретны, их надо считать целыми числами. И большинство программ так и делают.
-
> Styx © (27.02.19 11:10) [9] > А деньги не надо считать с плавающей запятой. Они же дискретны, > их надо считать целыми числами. И большинство программ > так и делают.
+1
Если хватает размерности, то можно currency использовать.
-
> типа decimal в дельфи нет.
Sorry, в Delphi он Currency.
-
> Styx © (27.02.19 11:13) [11] > > типа decimal в дельфи нет. > Sorry, в Delphi он Currency.
ну мне маловат currency оказался. из-за малого колва знаков после запятой. поэтому decimal взял.
-
> Styx © (27.02.19 11:04) [3] > Нужна в финансовых расчётах, для этого есть тип Decimal.
Decimal - это фиксированная точка. И тут уже нужно очень следить за руками, ибо в промежуточных расчетах легко потерять вообще всё.
Я от того и спросил про аналог Double, т.е. тип с плавающей точкой, то однозначно отображаемый на десятичную систему счисления. Ну не может же быть, что такое никому не требовалось?
-
В процессоре всего 3 вещественных типа. Остальное производные или своя мат-библиотека.
-
> Decimal - это фиксированная точка. И тут уже нужно очень > следить за руками, ибо в промежуточных расчетах легко потерять > вообще всё.
там 18 знаков перед запятой, и 10 знаков после запятой. это до фига, даже для расчетов. ну да, надо помнить что лучше сначала умножить, потом поделить. точности хватает даже для учета себестоимости товаров.
-
-
-
спасибо за ссылки!
-
А вот когда у меня есть 1 рубль, но при этом я смогу купить только 99 колобков спичек по 1 примерно копейке, после чего деньги закончатся - то ту-то только и начнёшь понимать всю глубину проблемы.
глубина мелкая.
внутренние расчеты делаются с точностью дабл. наружу выдаются результаты с дискретностью денежной единицы (чтобы в кассе могли заплатить или сдать сдачу) дельту не откусывают, а учитывают в следующих периодах.
|