реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> А есть ли возможность создать свою переменную размером, 3 байта?
smk
сообщение Jul 13 2011, 14:29
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Нужно оперировать с числом в диапазоне 0...99999. Если превысит значит ошибка. Наиболее подходящая из стандартных это long, но если сделать на байт короче, то вычисления будут делаться быстрее. А можно это как-то сделать? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 13 2011, 14:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Видимо на 8-битном контроллере будут быстрее???
Берите контроллер 32-битный. Будет за один такт ваше число проверять.
Тем более раз вам нужны вычисления, то у 32-битных как правило и частоты значительно выше.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 13 2011, 14:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(uriy @ Jul 13 2011, 17:36) *
Видимо на 8-битном контроллере будут быстрее???
Берите контроллер 32-битный. Будет за один такт ваше число проверять.
Тем более раз вам нужны вычисления, то у 32-битных как правило и частоты значительно выше.

Так хочется пристроить остатки tiny26. Уж не смейтесь.
Ну чтобы было понятно зачем мне это все, объясню. Хочу сделать небольшой частотомер (tiny26 + LCD 16x1). При измерении частоты в диапазоне 0...9,9999 Гц понадобится подсчитать число импульсов генератора за период взодного сигнала. Получим значение приода в мкС. Чтобы узнать частоту делаем 1/Т. Конечно для тиньки такой изврат довольно крут, но всеже нужно попробовать.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 13 2011, 15:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (smk @ Jul 13 2011, 16:29) *
но если сделать на байт короче

Зачем на байт? На 15 бит. 16 бит и переполнение как раз 17. На ASM.....

QUOTE (smk @ Jul 13 2011, 16:45) *
Получим значение приода в мкС. Чтобы узнать частоту делаем 1/Т. Конечно для тиньки такой изврат довольно крут, но всеже нужно попробовать.

Изврат в том, что хотите делать это быстро. А это делать быстро совсем не надо - это время по любому завязано на время индикации и соответственно время восприятия человеком, а это время огромное.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 13 2011, 15:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Нет, делать быстро не обязательно. Скорее размер памяти программ лимитирует. На ASM конечно интересно попробовать, но опыта никакого. Индикация на ЖКИ. Как готово - вывели туда. Время на проведение одного измерения во много раз превысит время на вычисление.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 13 2011, 16:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Есть ли какой то алгоритм, который позволит изящно сделать такое:
Код
volatile unsigned long count=100000000;
volatile float frq;

frq=((1/count)*100000000);

Напрашивающееся математическое упрощение вижу, но это частный случай.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 13 2011, 16:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (smk @ Jul 13 2011, 18:38) *
Есть ли какой то алгоритм, который позволит изящно сделать такое:
volatile unsigned long count=100000000;
volatile float frq;
frq=((1/count)*100000000);

За бездумное использование volatile и float и надо, расстреливать на месяц оставлять без обеда. Непонимание того, что такое целочисленное деление, остаток от деления и того, что 1/10 = 0 лечить учебником арифметики для начальной школы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 13 2011, 17:19
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Код
float    32    от 1E-37 до 1E+37, с точностью не менее 6 значащих десятичных цифр

соответственно 0,000000001 вписывается в диапазон. или я не прав?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 13 2011, 18:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (smk @ Jul 13 2011, 19:19) *
CODE
float    32    от 1E-37 до 1E+37, с точностью не менее 6 значащих десятичных цифр

соответственно 0,000000001 вписывается в диапазон. или я не прав?

А вода мокрая, 2+2=4, соль соленая.... эти утверждения тоже верны, но ТОЖЕ не имеют никакого отношения к тому, что Вы не знаете арифметики sad.gif. Повторяю, если 1 разделить нацело на любое число больше 1 получится 0. Ровно 0. А для полного "счастья", если любое число разделить на 0, то получится фигово. Итого, Ваш частотомер:
CODE
volatile unsigned long count=100000000;
volatile float frq;
frq=((1/count)*100000000);

сможет показывать 0, 1, и непонятно как, но бесконечность.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 13 2011, 20:10
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Небольшая история из собственной студенческой жизни. Получили на группу из 4 человек систему уравнений с 10 или 12, точно не помню, переменными. Мои приятели, закончили ту же школу, что и известный нам теперь, господин Перельман. Ну, говорят, два пальца ... Решаем с помощью определителей. Достали, для облегчения жизни, калькулятор (на дворе 70-е годы). Засучили рукава и погнали. И очень быстро ушагали в область огромных чисел. Стало не хватать разрядности вычислений, поперли ошибки округления и прочее (это потом стало ясно; калькулятор все это в плавучке ел и цифирки на гора выдавал). Два дня по 12 часов бились, действительно до последних сил. Результат - никакой. Ничего даже близко похожего на правильные цифры.

Позже все сделали методом Гаусса, где такие побочные эффекты просто не проявляются.

Зато получил наглядный урок влияния конечной разрядной сетки на точность вычислений.

А посмотришь, народ то там то сям float, double. Фантастика!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 14 2011, 06:35
Сообщение #11


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (sergeeff @ Jul 14 2011, 05:10) *
Зато получил наглядный урок влияния конечной разрядной сетки на точность вычислений.

Можно подробнее? Или ссылочку в соответствующий справочник) Спасибо)


2 smk: да подлите прямо на Си и все. Зачем мучать себя решением идеи ради идеи?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 14 2011, 07:08
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (haker_fox @ Jul 14 2011, 08:35) *
2 smk: да подлите прямо на Си и все. Зачем мучать себя решением идеи ради идеи?

Все хуже sad.gif. Вы не поняди, что он он и на 'C' не сумел. При этом зачем-то попытался воспользоваться float и обильно украсил все volatile.
После использования float следующим шагом может быть только использование printf().


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 14 2011, 08:04
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(haker_fox @ Jul 14 2011, 10:35) *
Можно подробнее? Или ссылочку в соответствующий справочник) Спасибо)


Ну полно раньше книжек было. Для интереса можно почитать:
http://developers.sun.com/solaris/articles/fp_errors.html
http://hijos.ru/2011/07/06/oshibki-o-kotor...-zadumyvaetsya/

и особенно забавно:
http://milkywaycenter.com/works/yurovitsky0.html
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 14 2011, 08:48
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(zltigo @ Jul 14 2011, 10:08) *
Все хуже sad.gif. Вы не поняди, что он он и на 'C' не сумел. При этом зачем-то попытался воспользоваться float и обильно украсил все volatile.
После использования float следующим шагом может быть только использование printf().

Хорошо. Пусть я ошибся и ничего не понимаю. Арифметики не знаю. Ну тогда расскажите мне свою идею как зная период в мкС получить значение частоты в формате 0,0000 ? Я действительно не знаю всех тонкостей С.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 14 2011, 08:54
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Гуру над вами издеваются просто - это их маленькая слабость sm.gif
подумайте над следующим: если число 1,0003 заменить на "10003 и запятая после первого (левого) знака"... не подскажет ничего?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016