Форум: "Начинающим";
Текущий архив: 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