Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

double для десятичной системы счисления


KSergey ©   (27.02.19 10:15

Все мы любим double со всеми его приколами для операций с [дробными] числами. (извините, я не сумел выбрать верный термин, поэтому написал так)
Когда мы пытаемся натянуть их использование на повсеместно используемые значения, представленные десятичными дробями, но получает массу весёлостей. При этом в 99% реальных случаев на самом деле входными значениями являются значения, заданные десятичной дробью, и выходные значения тоже хотим получить в виде десятичной дроби.

Собственно основная проблема double в том, что там - степени двойки, а не степени десяти хранятся.

Вопроса у меня два в связи с этим:

1) Подскажите, по каким словам загуглить готовые реализации double, который бы однозначно отображался именно на десятичное представление. Я не сумел придумать.

2) Почему мы до сих пор живём с тем double, который имеем? когда-то понятно его сделали для облегчения реализации в ЭВМ. Но сейчас, казалось бы, уже не должно быть проблемой сделать аппаратную реализацию работы с любым double. Но почему этого нет? и не видно даже каких-то подвижек? либо я плохо смотрю

ЗЫ
99% - субъективная цифра, у меня нет пруфов


dmk ©   (27.02.19 10:32[1]

>загуглить готовые реализации 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;


dmk ©   (27.02.19 10:40[2]

Да и никто, заметьте, никто не мешает вам спроектировать процессор с байтом в 10-бит :)
А также разработать систему команд на основе вашего нового байта. Все внимательно ждут и верят в Вас.


Styx ©   (27.02.19 11:04[3]

Для большинства задач привязка к десятичной системе не нужна. Нужна в финансовых расчётах, для этого есть тип Decimal. Если его возможностей не хватает, придётся, видимо, придумывать что-то своё.


KSergey ©   (27.02.19 11:06[4]

> dmk ©   (27.02.19 10:32) [1]
> С Double как раз нет никаких проблем. Есть проблемы с Single,
>  да и то решаемые, а вот что не так с Double? Точность у
> Double даже с запасом (15 знаков в десятичной системе).

Это так только кажется.
Уже суммы денег вполне себе близки к 15 тем самым разрядам имеют место быть на счетах банковских (особенно если хотят 4 или 6 знаков после запятой видеть), так что это только кажется, что увеличение точности что-то решает. На самом деле - совершенно ничего не решает, лишь позволяет до поры до времени закрыть глаза на проблему. Но не решает вообще ничего.


Styx ©   (27.02.19 11:08[5]

И проблема не в использовании степеней двойки в компьютере, а в использовании степеней десятки в быту. Именно десятка приводит к ряду чудес, которых бы не было при использовании двойки. Поэтому использовать не-двоичное представление где-то, кроме вывода на экран, едва ли оправданно.


dmk ©   (27.02.19 11:09[6]

>KSergey ©   (27.02.19 11:06) [4]
Пишите модуль вычислений с длинной математикой. Алгоритмы достаточно простые.
Сделайте для начала 128 бит (+, -, /, *), а там может и этого хватит пока.


Тимохов Дима ©   (27.02.19 11:09[7]


> Для большинства задач привязка к десятичной системе не нужна.
>  Нужна в финансовых расчётах, для этого есть тип 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';


KSergey ©   (27.02.19 11:09[8]

Когда мы работаем с физ. величинами и физ. расчетами - то там да, там в самом деле плавающие точки - отличная вещь.
А вот когда у меня есть 1 рубль, но при этом я смогу купить только 99 колобков спичек по 1 примерно копейке, после чего деньги закончатся - то ту-то только и начнёшь понимать всю глубину проблемы.


Styx ©   (27.02.19 11:10[9]

А деньги не надо считать с плавающей запятой. Они же дискретны, их надо считать целыми числами. И большинство программ так и делают.


Тимохов Дима ©   (27.02.19 11:12[10]


> Styx ©   (27.02.19 11:10) [9]
> А деньги не надо считать с плавающей запятой. Они же дискретны,
>  их надо считать целыми числами. И большинство программ
> так и делают.


+1

Если хватает размерности, то можно currency использовать.


Styx ©   (27.02.19 11:13[11]


> типа decimal в дельфи нет.

Sorry, в Delphi он Currency.


Тимохов Дима ©   (27.02.19 11:14[12]


> Styx ©   (27.02.19 11:13) [11]
> > типа decimal в дельфи нет.
> Sorry, в Delphi он Currency.


ну мне маловат currency оказался.
из-за малого колва знаков после запятой.
поэтому decimal взял.


KSergey ©   (27.02.19 11:15[13]

> Styx ©   (27.02.19 11:04) [3]
>  Нужна в финансовых расчётах, для этого есть тип Decimal.

Decimal - это фиксированная точка. И тут уже нужно очень следить за руками, ибо в промежуточных расчетах легко потерять вообще всё.

Я от того и спросил про аналог Double, т.е. тип с плавающей точкой, то однозначно отображаемый на десятичную систему счисления.
Ну не может же быть, что такое никому не требовалось?


dmk ©   (27.02.19 11:18[14]

В процессоре всего 3 вещественных типа. Остальное производные или своя мат-библиотека.


Тимохов Дима ©   (27.02.19 11:28[15]


> Decimal - это фиксированная точка. И тут уже нужно очень
> следить за руками, ибо в промежуточных расчетах легко потерять
> вообще всё.

там 18 знаков перед запятой, и 10 знаков после запятой.
это до фига, даже для расчетов.
ну да, надо помнить что лучше сначала умножить, потом поделить.
точности хватает даже для учета себестоимости товаров.


RWolf ©   (27.02.19 11:35[16]

https://github.com/rvelthuis/DelphiBigNumbers


Styx ©   (27.02.19 11:50[17]

https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library


KSergey ©   (27.02.19 12:21[18]

спасибо за ссылки!


иосифович ©   (27.02.19 12:23[19]

А вот когда у меня есть 1 рубль, но при этом я смогу купить только 99 колобков спичек по 1 примерно копейке, после чего деньги закончатся - то ту-то только и начнёшь понимать всю глубину проблемы.



глубина мелкая.

внутренние расчеты делаются с точностью дабл.
наружу выдаются результаты с дискретностью денежной единицы (чтобы в кассе могли заплатить или сдать сдачу)
дельту не откусывают, а учитывают в следующих периодах.


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо