Собственный тип данных с плавающей точкой
От: Аноним  
Дата: 22.12.09 17:21
Оценка:
Появилась острая необходимость создать свой тип данных по типу Double. Точности Float к сожалению не хватает, а использовать тип Double не представляется возможным. Для созданного типа понадобятся операции сложения и умножения. Наверняка кто-нибудь что-то подобное делал. Можете поделиться советами или кодом?
Re: Собственный тип данных с плавающей точкой
От: Vamp Россия  
Дата: 22.12.09 17:25
Оценка:
А>Появилась острая необходимость создать свой тип данных по типу Double...
Подумай хорошенько, правда ли она появилась? Уж не собираешься ли ты хранить там денежные значения?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 22.12.09 17:32
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>Появилась острая необходимость создать свой тип данных по типу Double...

V>Подумай хорошенько, правда ли она появилась? Уж не собираешься ли ты хранить там денежные значения?

Точно, точно! Речь идет о серьезной математике, которая заложена в процессор.
Re: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 17:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Появилась острая необходимость создать свой тип данных по типу Double. Точности Float к сожалению не хватает, а использовать тип Double не представляется возможным. Для созданного типа понадобятся операции сложения и умножения. Наверняка кто-нибудь что-то подобное делал. Можете поделиться советами или кодом?

какие требования к этому типу? (отличные от double)
система счисления, место в памяти, скорость операторов...
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 17:39
Оценка:
Здравствуйте, toffeeA, Вы писали:

A> которая заложена в процессор.

c++?
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Собственный тип данных с плавающей точкой
От: Vamp Россия  
Дата: 22.12.09 17:39
Оценка:
A>Точно, точно! Речь идет о серьезной математике, которая заложена в процессор.
Деньги в данных с плавающей точкой не хранят никогда.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 17:40
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Деньги в данных с плавающей точкой не хранят никогда.

уплывут...
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 22.12.09 17:45
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


C>какие требования к этому типу? (отличные от double)

C>система счисления, место в памяти, скорость операторов...

Учитывая что в этот тип придется переходить из float, наверное двоичная удобней будет.
Место в памяти есть, таких значений не много будет, быстродействие не сильно важно, так как именно этот обсчет планируется выполнять раз в 30сек (60 сек)
Re[4]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 22.12.09 17:47
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, toffeeA, Вы писали:



C>c++?


Си
Re[4]: Собственный тип данных с плавающей точкой
От: Sni4ok  
Дата: 22.12.09 17:53
Оценка:
Здравствуйте, Vamp, Вы писали:

A>>Точно, точно! Речь идет о серьезной математике, которая заложена в процессор.

V>Деньги в данных с плавающей точкой не хранят никогда.

конечноже хранят
Re[5]: Собственный тип данных с плавающей точкой
От: Vamp Россия  
Дата: 22.12.09 17:57
Оценка:
S>конечноже хранят
Только там, где плюс-минус доллар ничего не решает.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 18:08
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Здравствуйте, Caracrist, Вы писали:


C>>Здравствуйте, Аноним, Вы писали:


C>>какие требования к этому типу? (отличные от double)

C>>система счисления, место в памяти, скорость операторов...

A>Учитывая что в этот тип придется переходить из float, наверное двоичная удобней будет.

A>Место в памяти есть, таких значений не много будет, быстродействие не сильно важно, так как именно этот обсчет планируется выполнять раз в 30сек (60 сек)

я выделил жирным важную часть вопроса...
И того, вам нужен double.

от сюда два вопроса:
1. Почему "использовать тип Double не представляется возможным" ?
2. Какие базовые типы доступны для реализации аналога Double?
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 22.12.09 18:17
Оценка:
Здравствуйте, Caracrist, Вы писали:


C>я выделил жирным важную часть вопроса...

C>И того, вам нужен double.

C>от сюда два вопроса:

C>1. Почему "использовать тип Double не представляется возможным" ?
C>2. Какие базовые типы доступны для реализации аналога Double?

1. Потому что процессор не поддерживает такой тип данных. Написать Double в коде можно, но он его к 32-битному представлению приведет.
2. Из базовых типов — все целочисленные от char(unsigned char) до unsigned integer, и float.
Re[5]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 18:54
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Здравствуйте, Caracrist, Вы писали:



C>>я выделил жирным важную часть вопроса...

C>>И того, вам нужен double.

C>>от сюда два вопроса:

C>>1. Почему "использовать тип Double не представляется возможным" ?
C>>2. Какие базовые типы доступны для реализации аналога Double?

A>1. Потому что процессор не поддерживает такой тип данных. Написать Double в коде можно, но он его к 32-битному представлению приведет.

A>2. Из базовых типов — все целочисленные от char(unsigned char) до unsigned integer, и float.

О! Уже приближаемся к истине!
Сложение, вычитание и умножение побитово не сложно организовать...
Вопрос: какие операции этот тип должен поддерживать?
(деление, корень, синусообразные... )
~~~~~
~lol~~
~~~ Single Password Solution
Re[5]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 22.12.09 19:02
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Здравствуйте, Caracrist, Вы писали:



C>>я выделил жирным важную часть вопроса...

C>>И того, вам нужен double.

C>>от сюда два вопроса:

C>>1. Почему "использовать тип Double не представляется возможным" ?
C>>2. Какие базовые типы доступны для реализации аналога Double?

A>1. Потому что процессор не поддерживает такой тип данных. Написать Double в коде можно, но он его к 32-битному представлению приведет.

A>2. Из базовых типов — все целочисленные от char(unsigned char) до unsigned integer, и float.

мысль:
Смотреь в сторону реализаций Decimal. Их благо хватает, а логика должна быть аналогичной.
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Собственный тип данных с плавающей точкой
От: Erop Россия  
Дата: 22.12.09 23:47
Оценка:
Здравствуйте, toffeeA, Вы писали:
A>Место в памяти есть, таких значений не много будет, быстродействие не сильно важно, так как именно этот обсчет планируется выполнять раз в 30сек (60 сек)

А чем, тогда, не устраивает double?
Вообще, о какой платформе речь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Собственный тип данных с плавающей точкой
От: Erop Россия  
Дата: 22.12.09 23:49
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>2. Из базовых типов — все целочисленные от char(unsigned char) до unsigned integer, и float.


Можно rational организовать, как отношение двух int, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 07:58
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, toffeeA, Вы писали:

A>>Место в памяти есть, таких значений не много будет, быстродействие не сильно важно, так как именно этот обсчет планируется выполнять раз в 30сек (60 сек)

E>А чем, тогда, не устраивает double?

E>Вообще, о какой платформе речь?

Речь идет о процессоре SHARC. А вы когда-нибудь сталкивались с реализацией типа в виде простой дроби или это просто мысль? У меня тоже она возникла, но какой-то маленький диапазон получается. Минимально в виде такой дроби можно записать 1/(2^32), что соответствует порядку 1E-10. А максимально (2^32)/1. Можно конечно парочку интов взять, но по-моему мне только лишь усложнит реализацию?
Re[6]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 08:17
Оценка:
Здравствуйте, Caracrist, Вы писали:


C>О! Уже приближаемся к истине!

C>Сложение, вычитание и умножение побитово не сложно организовать...
C>Вопрос: какие операции этот тип должен поддерживать?
C>(деление, корень, синусообразные... )

Из операций только сложение, вычитание и умножение. Допустим организую я свой тип по типу double с 11-битной экспонентой и 52-битной мантиссой. Побитно достучаться к нему смогу и сконвертировать из float в этот формат и обратно. Но как организовать арифметические операции "побитово" без потери точности введенного типа я в упор не понимаю. И что за тип такой Decimal, можно поподробней?
Re[5]: Собственный тип данных с плавающей точкой
От: alzt  
Дата: 23.12.09 08:17
Оценка:
Здравствуйте, toffeeA, Вы писали:

E>>А чем, тогда, не устраивает double?

E>>Вообще, о какой платформе речь?

A>Речь идет о процессоре SHARC. А вы когда-нибудь сталкивались с реализацией типа в виде простой дроби или это просто мысль?


О чём речь — о реализации в виде простой дроби или о типе данных с плавающей точкой?
Если нужно деньги считать, то плавающая точка тут не нужна. Достаточно обычного целого. При этом надо помнить, что считаем не в единицах, а в сотых долях единиц (или в десятитысячных), в зависимости от задачи. Если диапазон маленький — то слепить несколько целых в один класс.
Re[6]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 08:27
Оценка:
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, toffeeA, Вы писали:


E>>>А чем, тогда, не устраивает double?

E>>>Вообще, о какой платформе речь?

A>>Речь идет о процессоре SHARC. А вы когда-нибудь сталкивались с реализацией типа в виде простой дроби или это просто мысль?


A>О чём речь — о реализации в виде простой дроби или о типе данных с плавающей точкой?

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

Кто-то тут шутку про деньги кинул и она прижилась . Речь идет не о деньгах, а о мощном типе с плавающей точкой по типу Double. Можно в точности как Double. Мне предложили реализацию плавающей точки в виде отношения двух int, то есть в виде простой дроби, но я считаю что это чуток не подходит из-за маленького диапазона.
Re[6]: Собственный тип данных с плавающей точкой
От: Sni4ok  
Дата: 23.12.09 08:37
Оценка:
Здравствуйте, Vamp, Вы писали:

S>>конечноже хранят

V>Только там, где плюс-минус доллар ничего не решает.

множество торговых терминалов хранят денежные значения в даблах, не говорите чего не знаете.
Re[5]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 23.12.09 08:43
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Здравствуйте, Erop, Вы писали:


E>>Здравствуйте, toffeeA, Вы писали:

A>>>Место в памяти есть, таких значений не много будет, быстродействие не сильно важно, так как именно этот обсчет планируется выполнять раз в 30сек (60 сек)

E>>А чем, тогда, не устраивает double?

E>>Вообще, о какой платформе речь?

A>Речь идет о процессоре SHARC. А вы когда-нибудь сталкивались с реализацией типа в виде простой дроби или это просто мысль? У меня тоже она возникла, но какой-то маленький диапазон получается. Минимально в виде такой дроби можно записать 1/(2^32), что соответствует порядку 1E-10. А максимально (2^32)/1. Можно конечно парочку интов взять, но по-моему мне только лишь усложнит реализацию?


кпд у такого подхода низкий
1/2 = 2/4 = 6/12 и тд.
реально будут использоватся только простые числа из диапазона 32 бит...
~~~~~
~lol~~
~~~ Single Password Solution
Re[7]: Собственный тип данных с плавающей точкой
От: alzt  
Дата: 23.12.09 08:44
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Кто-то тут шутку про деньги кинул и она прижилась . Речь идет не о деньгах, а о мощном типе с плавающей точкой по типу Double. Можно в точности как Double. Мне предложили реализацию плавающей точки в виде отношения двух int, то есть в виде простой дроби, но я считаю что это чуток не подходит из-за маленького диапазона.


Читал вскольз, поэтому не понял.
Тогда почему бы не реализовать подобно double. С мантисой, экспонентой. Работать будет медленнее, плюс тестировать много.
Наверняка в сети уже есть подобные реализации.
Re[8]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 09:04
Оценка:
Здравствуйте, alzt, Вы писали:


A>Читал вскольз, поэтому не понял.

A>Тогда почему бы не реализовать подобно double. С мантисой, экспонентой. Работать будет медленнее, плюс тестировать много.
A>Наверняка в сети уже есть подобные реализации.

Мне тоже кажется, что это давно уже и много раз кем-то написано. Хочется найти готовенькое, но пока найти не могу
Re[7]: Собственный тип данных с плавающей точкой
От: Caracrist https://1pwd.org/
Дата: 23.12.09 09:46
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Здравствуйте, Caracrist, Вы писали:



C>>О! Уже приближаемся к истине!

C>>Сложение, вычитание и умножение побитово не сложно организовать...
C>>Вопрос: какие операции этот тип должен поддерживать?
C>>(деление, корень, синусообразные... )

A>Из операций только сложение, вычитание и умножение. Допустим организую я свой тип по типу double с 11-битной экспонентой и 52-битной мантиссой. Побитно достучаться к нему смогу и сконвертировать из float в этот формат и обратно. Но как организовать арифметические операции "побитово" без потери точности введенного типа я в упор не понимаю. И что за тип такой Decimal, можно поподробней?


сложение:
на базе 16 битного флоата:
1 — знак
5 — смещение
10 — число

два числа:
первое: смещение: 10010 = +2, число: 0000001101 == 110100.0
второе: смещение: 01011 = -5, число: 0110101001 == 1101.01001
выводим их оба в bitarray одинаковой длины:

00101100.00000000
00001101.01001000
складываем:
00111001.01001000
переводим обратно к плавающей точке:
1110010101 -4 (единица в конце изза округления)
результат: смещение: 01100 = -4 число: 1110010101 == 111001.0101

максимальный необходимый bitarray размером в диапазон смещения, для double 11bit это 256 байт, хотя можно обойтись и двойным размером длины числа (52х2 bit у double = 13 байт) так как часть ниже всё равно урежется.
Вычитание по такому же приципу.

Теперь умножение:
возьмём те же два числа: 110100.0 и 1101.01001
умножаем в столбик:
110101001 +0 (х1)
+
110101001 +2 (х100)
+
110101001 +3 (х1000)
Складывать мы умеем.. дальше делаем поправку смещения на (+2 -5)
000110101001.
011010100100.
100001001101. = 1000010011 +2

0100001001100.
0110101001000.
1010110010100. = 1010110011 +3

1010110011 +3 +2 -5 = 1010110011 +0
результат умножения: смещение: 10000 = 0, число: 1010110011 == 1010110011.0
сверяем с калькулятором: 1010110010.10100

Деление если очень понадобится можно реализовать бинарным поиском через умножение...


ps. Decimal
~~~~~
~lol~~
~~~ Single Password Solution
Re[7]: Собственный тип данных с плавающей точкой
От: SaZ  
Дата: 23.12.09 09:53
Оценка:
Здравствуйте, toffeeA, Вы писали:

...

A>Мне предложили реализацию плавающей точки в виде отношения двух int, то есть в виде простой дроби, но я считаю что это чуток не подходит из-за маленького диапазона.


Если постараться, то точность при подобном подходе может быть расширена за счёт костылей вида 1/( 1/2^32 ) и 2^31/1 * 2^31/1 и т.д. Когда-то писал подобное под винду для проведения мат. расчётов с большой точностью. К сожалению, не подыму никаких этих наработок, но по скорости они (в большинстве моих задач) превосходили решения на основе длинной арифметики. Главное — правильно всё спроектировать .
Re[7]: Собственный тип данных с плавающей точкой
От: wtom  
Дата: 23.12.09 10:14
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Vamp, Вы писали:


S>>>конечноже хранят

V>>Только там, где плюс-минус доллар ничего не решает.

S>множество торговых терминалов хранят денежные значения в даблах, не говорите чего не знаете.


Примеры можно? И какие именно денежные значения? Value, price...? Без подвоха, просто интересно.
Не стоит переходить реку вброд, если известно только, что ее глубина (средняя) 4 фута.
Re[8]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 12:12
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>сложение:

C>на базе 16 битного флоата:
C>1 — знак
C>5 — смещение
C>10 — число

C>два числа:

C>первое: смещение: 10010 = +2, число: 0000001101 == 110100.0
C>второе: смещение: 01011 = -5, число: 0110101001 == 1101.01001
C>выводим их оба в bitarray одинаковой длины:

C>00101100.00000000

C>00001101.01001000
C>складываем:
C>00111001.01001000
C>переводим обратно к плавающей точке:
C>1110010101 -4 (единица в конце изза округления)
C>результат: смещение: 01100 = -4 число: 1110010101 == 111001.0101

C>максимальный необходимый bitarray размером в диапазон смещения, для double 11bit это 256 байт, хотя можно обойтись и двойным размером длины числа (52х2 bit у double = 13 байт) так как часть ниже всё равно урежется.

C>Вычитание по такому же приципу.

C>Теперь умножение:

C>возьмём те же два числа: 110100.0 и 1101.01001
C>умножаем в столбик:
C>110101001 +0 (х1)
C>+
C>110101001 +2 (х100)
C>+
C>110101001 +3 (х1000)
C>Складывать мы умеем.. дальше делаем поправку смещения на (+2 -5)
C>000110101001.
C>011010100100.
C>100001001101. = 1000010011 +2

C>0100001001100.

C>0110101001000.
C>1010110010100. = 1010110011 +3

C>1010110011 +3 +2 -5 = 1010110011 +0

C>результат умножения: смещение: 10000 = 0, число: 1010110011 == 1010110011.0
C>сверяем с калькулятором: 1010110010.10100

C>Деление если очень понадобится можно реализовать бинарным поиском через умножение...


Спасибо! На примере все сразу понятней стало, сейчас буду пробовать.
Re[7]: Собственный тип данных с плавающей точкой
От: Vamp Россия  
Дата: 23.12.09 13:19
Оценка:
S>множество торговых терминалов хранят денежные значения в даблах, не говорите чего не знаете.
Такие разработчики. Потом считают, почему у них не сходятся дебет с кредетом.
Да здравствует мыло душистое и веревка пушистая.
Re: Собственный тип данных с плавающей точкой
От: Кодт Россия  
Дата: 23.12.09 14:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> Точности Float к сожалению не хватает, а использовать тип Double не представляется возможным.


А это задача, изначально требующая высокой точности, или ошибка набегает?
Может, вычислительный метод поменять, а там и float хватит?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[5]: Собственный тип данных с плавающей точкой
От: Кодт Россия  
Дата: 23.12.09 14:46
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Речь идет о процессоре SHARC.


У шарка есть аппаратная поддержка 40-битных плавающих чисел.
Если их точности хватит, то, может, написать ассемблерные вставки?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: Собственный тип данных с плавающей точкой
От: toffeeA  
Дата: 23.12.09 15:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:


А>> Точности Float к сожалению не хватает, а использовать тип Double не представляется возможным.


К>А это задача, изначально требующая высокой точности, или ошибка набегает?

К>Может, вычислительный метод поменять, а там и float хватит?

Нет, не ошибка набегает. Вычисляются коэффициенты аппроксимационного полинома. И реально не порядка не хватает, а точности мантиссы, знаков после запятой. При определенном раскладе получается так, что циферки сжирают друг друга(складываются и вычитаются) и получается 0, а должен быть не 0! Я уже занялась созданием Double, хотя и не испытываю оптимизма по этому поводу.
Re[3]: Собственный тип данных с плавающей точкой
От: Кодт Россия  
Дата: 23.12.09 15:41
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Нет, не ошибка набегает. Вычисляются коэффициенты аппроксимационного полинома. И реально не порядка не хватает, а точности мантиссы, знаков после запятой. При определенном раскладе получается так, что циферки сжирают друг друга(складываются и вычитаются) и получается 0, а должен быть не 0! Я уже занялась созданием Double, хотя и не испытываю оптимизма по этому поводу.


Когда циферки сжирают друг друга — это именно что ошибка набегает.
Например, величина ошибки зависит от порядка суммирования. Если суммировать числа по возрастанию абсолютного значения, ошибка будет меньшей, если по убыванию — большей.
Вычисление сходящегося ряда — т.е. сумма убывающей последовательности — в наивной реализации даст большую ошибку.

Глубоко вычислительной математикой не занимался, поэтому не скажу за хорошие методы вычисления коэффициентов. Но они должны быть, надо порыться в гугле и специальной литературе.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[5]: Собственный тип данных с плавающей точкой
От: Erop Россия  
Дата: 26.12.09 08:24
Оценка:
Здравствуйте, toffeeA, Вы писали:

A>Речь идет о процессоре SHARC. А вы когда-нибудь сталкивались с реализацией типа в виде простой дроби или это просто мысль? У меня тоже она возникла, но какой-то маленький диапазон получается. Минимально в виде такой дроби можно записать 1/(2^32), что соответствует порядку 1E-10. А максимально (2^32)/1. Можно конечно парочку интов взять, но по-моему мне только лишь усложнит реализацию?


Сталкивался. От задачи зависит хватит диапазона или нет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.