![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Свой тип с плавающей запятой.
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.