Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];

Вниз

Свой тип с плавающей запятой.   Найти похожие ветки 

 
Luarvic   (2011-02-18 08:45) [0]

Мне нужно хранить небольшие не целые числа со знаком.
В хелпе делфи я ненашел того что мне надо, Single ближе остальных, но без знака. И вот я решил сделать свой тип:
1 байт - знак
2 байт - целая часть
3-4 байты - дробная часть
Это ок, или я что-то делаю не так?


 
Inovet ©   (2011-02-18 08:48) [1]

> [0] Luarvic   (18.02.11 08:45)
> Это ок, или я что-то делаю не так?

Это развод?


 
Slym ©   (2011-02-18 08:57) [2]

Luarvic   (18.02.11 8:45)
начни с пайки нового математического процессора под свой тип данных


 
Luarvic   (2011-02-18 09:14) [3]

Ну ладна, я решил использовать Single, но все равно знак придется хранить  отдельно?


 
Inovet ©   (2011-02-18 09:19) [4]

> [3] Luarvic   (18.02.11 09:14)
> но все равно знак придется хранить  отдельно?

С каких пор типы с плавающей точкой стали без знака? Цитату или ссылку в студию.


 
KilkennyCat ©   (2011-02-18 09:23) [5]

конечно. потребуется один байт. знак минус равен 0х2D, плюс равен  0х2B
в будущем, для процессоров с вероятностной логикой, рекомендуется знак ± равный 0хB1, или Ӝ


 
Luarvic   (2011-02-18 09:24) [6]

http://www.delphisources.ru/pages/faq/faq_delphi_basics/Double.php.html


 
KilkennyCat ©   (2011-02-18 09:32) [7]

ну и зачем ты нам ссылку всякой фигни даешь? мы справкой умеем пользоваться.
а уж если и читать что помимо справки, то вот:
http://www.cyberguru.ru/programming/delphi/real-numbers.html


 
Inovet ©   (2011-02-18 09:33) [8]

> [5] KilkennyCat ©   (18.02.11 09:23)
> конечно. потребуется один байт. знак минус равен 0х2D, плюс равен  0х2B

В вероятностной может быть любой символ, но с различной вероятностью, как в квантовой механике и ведь живём и состоим из этого. Так что...

А чё, в DBF так и хранится, про вероятностную логику тогда не догадались.


 
Inovet ©   (2011-02-18 09:35) [9]

> [6] Luarvic   (18.02.11 09:24)
> http://www.delphisources.ru/pages/faq/faq_delphi_basics/Double.php.html

И чё это?
Где цитата из справки, которую ты читал?


 
Sha ©   (2011-02-18 09:49) [10]

> Luarvic   (18.02.11 09:24) [6]

Там еще нуля нет. Не забудь свой нуль реализовать.


 
Luarvic   (2011-02-18 09:50) [11]

Я читал Delphi Language Reference
Type Range Significant digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63+1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 922337203685477.5807 19-20 8


 
Sha ©   (2011-02-18 09:59) [12]

> Luarvic   (18.02.11 09:50) [11]

Наверно, ты разобрался с представлением чисел с плавающей точкой.


 
Inovet ©   (2011-02-18 10:11) [13]

> [11] Luarvic   (18.02.11 09:50)
> Significant digits

Значимые цифры - т.е. точность, а о знаке здесь не упоминается. Короче, знак есть у них, не парься, а лучше погчитай о вещественных типах.


 
RWolf ©   (2011-02-18 11:07) [14]


> Luarvic   (18.02.11 08:45) 
> Мне нужно хранить небольшие не целые числа со знаком.

Предположу, что вполне достаточно хранить их домноженными на тысячу (для трех цифр после запятой) и в виде Integer.


 
xmen   (2011-02-18 11:25) [15]


> Luarvic   (18.02.11 08:45) 
> Мне нужно хранить небольшие не целые числа со знаком.


я что-то не понял, чем не устраивают имеющиеся типы?

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

если цель именно сделать что-то своё, то нужно начинать с изучения теоретического материала, а если нужно просто использовать некоторую функциональность, чтобы реализовать задачу, то лучше найти готовую библиотеку

http://alenacpp.blogspot.com/2007/03/blog-post_21.html


> В хелпе делфи я ненашел того что мне надо, Single ближе
> остальных, но без знака. И вот я решил сделать свой тип:
> 1 байт - знак2 байт - целая часть3-4 байты - дробная частьЭто
> ок, или я что-то делаю не так?


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


 
Luarvic   (2011-02-18 13:52) [16]

буду юзать Single


 
KilkennyCat ©   (2011-02-18 13:57) [17]

если будещь операции над ними еще проводить, прочитай статью Антона Григорьева, ссылку на которую я приводил в [7] главцу 6. "Примеры «неправильного» поведения вещественных типов"


 
han_malign   (2011-02-18 14:55) [18]


> Предположу, что вполне достаточно хранить их домноженными
> на тысячу (для трех цифр после запятой) и в виде Integer.

- не совсем - нужна коррекция для мультипликативных операций:
type TFixed1000 = type LongInt;
mul(x1,x2: TFixed1000) = TFixed1000(int64(x1*x2) div 1000);
div(x1,x2: TFixed1000) = TFixed1000(int64(1000*x1) div x2);

и, тогда уж, для фиксированной точки логичней выбрать базу 65536...

Домашнее задание: Объяснить смысл приведения к int64.
Заодно понять - в чем еще подвох фиксированной точки без поддержки процессором, какую проверку надо добавить и какое исключение возбудить...


 
KSergey ©   (2011-02-18 15:52) [19]

> Luarvic   (18.02.11 13:52) [16]
> буду юзать Single

Чем все же Double не устраивает?


 
sniknik ©   (2011-02-18 16:01) [20]

> Чем все же Double не устраивает?
почему сразу не Extended ? все одно все вычисления делаются в нем, а после приводятся к типу, а так не будет лишних преобразований.


 
KSergey ©   (2011-02-18 16:05) [21]

> sniknik ©   (18.02.11 16:01) [20]
> почему сразу не Extended ?

Привычка :)


 
Luarvic   (2011-02-19 04:00) [22]

http://www.delphisources.ru/pages/faq/faq_delphi_basics/Single.php.html написано что сингл быстрее, к тому же мне плевать на скорость вычислений, мне нужно передавать эти данные по сети


 
KilkennyCat ©   (2011-02-19 09:05) [23]

ну если сеть через COM-порт сделана, то тогда да, это понятно.


 
KSergey ©   (2011-02-19 12:07) [24]

> Luarvic   (19.02.11 04:00) [22]

А Single сопроцессором напрямую поддерживается? если нет - тогда см. sniknik ©   (18.02.11 16:01) [20] и на том сайте врут.


 
Amoeba_   (2011-02-19 22:12) [25]


> Luarvic   (19.02.11 04:00) [22]
>
> http://www.delphisources.ru/pages/faq/faq_delphi_basics/Single.
> php.html написано что сингл быстрее

Читать: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
Цитата оттуда:
... типы Single, Double и Extended. Extended – это родной для сопроцессора тип, а типы Single и Double получаются из него очень простым усечением. При загрузке числа типа Single или Double во внутренний регистр сопроцессора последний конвертирует их в Extended. Напротив, при выгрузке чисел этих типов из регистра в память сопроцессор усекает их до нужного размера.

P.S. Делаем вывод.


 
KilkennyCat ©   (2011-02-19 22:51) [26]


> P.S. Делаем вывод.

Вывод - быстрее. он при выгрузке из регистра не все выгружает, за счет чего усечение и происходит, а выгрузка становится быстрее.
:)


 
sniknik ©   (2011-02-20 00:48) [27]

> он при выгрузке из регистра не все выгружает, за счет чего усечение и происходит, а выгрузка становится быстрее.
т.е. по твоей логике если выгружать бит (ну вот не нужно больше) то будет максимально быстро...  чего же тогда булеан = байту, а после, в OLE стали и 2х байтные булеаны использовать? могли бы максимально быстрый битовый способ оставить...

p.s. не верный вывод. меньше не всегда быстрее.


 
clickmaker ©   (2011-02-20 01:00) [28]

> в OLE стали и 2х байтные булеаны использовать?

это на случай войны


 
KilkennyCat ©   (2011-02-20 01:02) [29]


> т.е. по твоей логике если выгружать бит (ну вот не нужно
> больше) то будет максимально быстро...

ну, если следовать этой логике, то да. надо только адресацию перепаять.


 
Германн ©   (2011-02-20 02:07) [30]


> sniknik ©   (20.02.11 00:48) [27]
>
> > он при выгрузке из регистра не все выгружает, за счет
> чего усечение и происходит, а выгрузка становится быстрее.
>
> т.е. по твоей логике

Там же смайлик стоит, Коля!


 
Anatoly Podgoretsky ©   (2011-02-20 10:41) [31]

> clickmaker  (20.02.2011 01:00:28)  [28]

На случай войны они четырех байтовые оставили.


 
sniknik ©   (2011-02-20 11:20) [32]

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

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

кстати и сеть тоже работает скорее всего не так как он себе это представляет. т.е. если у него передается ряд чисел, в несколько мегабайт (к примеру), и смена типа уменьшает размер в 2 раза, то да это ускорит передачу, но если эта борьба из-за нескольких байт/десятков байт в пакете...  то вряд ли, т.к. оно там имеет какой-то минимальный передаваемый размер (типа кластера на диске=4кб, даже если в него записан 1 байт), т.е. борьба за биты внутри этого "кластера" ни к чему не приведет, кроме усложнения алгоритма/лишних преобразований/неудобства работы со структурой (то что на выходе поток байт ничего не значит, в основе TCP/IP обмен датаграммами (пакетами), это уже после вам предоставляется поток)/возможности ошибок.
+ к первому случаю, несколько мегабайт чаще выгоднее архивировать/разархивировать, а не подгонять типы под минимальную предполагаемую вместимость значений (даже при архивации в обоих случаях... "рыхлые" данные могут дать в результате меньший обьем).


 
KilkennyCat ©   (2011-02-20 12:37) [33]


> сдвигом переменных на четные адреса

я вот сейчас техасинструментовский контроллер мучаю, так там
четная адресация только.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.004 c
15-1297097095
***
2011-02-07 19:44
2011.05.29
Промо ролик демонстраций по физике НИЯУ МИФИ


1-1255882069
aha
2009-10-18 20:07
2011.05.29
Получаю данные ( неполный IEEE формат - 3 байта) , как проще


15-1297282011
картман
2011-02-09 23:06
2011.05.29
SCAN


15-1297167332
Копир
2011-02-08 15:15
2011.05.29
Страна дураков или?


2-1297935742
vmvlad
2011-02-17 12:42
2011.05.29
Отображение компонента StaticText





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский