Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Luarvic ©   (2011-02-18 08:45:00) 

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


KilkennyCat   (2011-02-20 12:37:00) [1]


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

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


sniknik   (2011-02-20 11:20:00) [2]

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

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

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


Anatoly Podgoretsky   (2011-02-20 10:41:00) [3]

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

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


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


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

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


KilkennyCat   (2011-02-20 01:02:00) [5]


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

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


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

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

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


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

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

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


KilkennyCat   (2011-02-19 22:51:00) [8]


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

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


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


> 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. Делаем вывод.


KSergey   (2011-02-19 12:07:00) [10]

> Luarvic   (19.02.11 04:00) [22]

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


KilkennyCat   (2011-02-19 09:05:00) [11]

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


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

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


KSergey   (2011-02-18 16:05:00) [13]

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

Привычка :)


sniknik   (2011-02-18 16:01:00) [14]

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


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

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

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


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


> Предположу, что вполне достаточно хранить их домноженными
> на тысячу (для трех цифр после запятой) и в виде 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.
Заодно понять - в чем еще подвох фиксированной точки без поддержки процессором, какую проверку надо добавить и какое исключение возбудить...


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

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


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

буду юзать Single


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


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


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

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

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

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


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


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


RWolf   (2011-02-18 11:07:00) [20]


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо