Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: А есть ли возможность создать свою переменную размером
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Нужно оперировать с числом в диапазоне 0...99999. Если превысит значит ошибка. Наиболее подходящая из стандартных это long, но если сделать на байт короче, то вычисления будут делаться быстрее. А можно это как-то сделать? Спасибо.
uriy
Видимо на 8-битном контроллере будут быстрее???
Берите контроллер 32-битный. Будет за один такт ваше число проверять.
Тем более раз вам нужны вычисления, то у 32-битных как правило и частоты значительно выше.
smk
Цитата(uriy @ Jul 13 2011, 17:36) *
Видимо на 8-битном контроллере будут быстрее???
Берите контроллер 32-битный. Будет за один такт ваше число проверять.
Тем более раз вам нужны вычисления, то у 32-битных как правило и частоты значительно выше.

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

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

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

Изврат в том, что хотите делать это быстро. А это делать быстро совсем не надо - это время по любому завязано на время индикации и соответственно время восприятия человеком, а это время огромное.
smk
Нет, делать быстро не обязательно. Скорее размер памяти программ лимитирует. На ASM конечно интересно попробовать, но опыта никакого. Индикация на ЖКИ. Как готово - вывели туда. Время на проведение одного измерения во много раз превысит время на вычисление.
smk
Есть ли какой то алгоритм, который позволит изящно сделать такое:
Код
volatile unsigned long count=100000000;
volatile float frq;

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

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

За бездумное использование volatile и float и надо, расстреливать на месяц оставлять без обеда. Непонимание того, что такое целочисленное деление, остаток от деления и того, что 1/10 = 0 лечить учебником арифметики для начальной школы.
smk
Код
float    32    от 1E-37 до 1E+37, с точностью не менее 6 значащих десятичных цифр

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

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

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

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

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


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

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

Хорошо. Пусть я ошибся и ничего не понимаю. Арифметики не знаю. Ну тогда расскажите мне свою идею как зная период в мкС получить значение частоты в формате 0,0000 ? Я действительно не знаю всех тонкостей С.
ARV
Гуру над вами издеваются просто - это их маленькая слабость sm.gif
подумайте над следующим: если число 1,0003 заменить на "10003 и запятая после первого (левого) знака"... не подскажет ничего?
smk
Подскажет конечно.
sergeeff
Цитата(ARV @ Jul 14 2011, 12:54) *
Гуру над вами издеваются просто - это их маленькая слабость sm.gif


Наша маленькая слабость состоит в том, чтобы хоть как-то разбудить мыслительный процесс.
haker_fox
QUOTE (zltigo @ Jul 14 2011, 16:08) *
Все хуже sad.gif. Вы не поняди, что он он и на 'C' не сумел.

Я подумал, что автор знает Си из этого замечания
QUOTE (smk @ Jul 14 2011, 00:15) *
На ASM конечно интересно попробовать, но опыта никакого.


QUOTE (smk @ Jul 14 2011, 17:48) *
Ну тогда расскажите мне свою идею как зная период в мкС получить значение частоты в формате 0,0000 ? Я действительно не знаю всех тонкостей С.

T = 0.00005 сек. В "тиках" таймера это будет, скажем 50. Если тик таймера равен 1 мкс. Что нужно сделать, чтобы получить частоту? Ну я бы, не оптимально, конечно сделал так
1000000 мкс / 50 = 20 000 Гц.

Т.е. общая формула для вычисления частоты по полученным "тикам" таймера F = 1 000 000 / количество_тиков.
Или вопрос был в другом?

Если нужна точность n знаком после запятой, то числитель необходимо домножить на 10^n. Например, нам нужно измерять частоту с точностю 2 знака после запятой. Предположим, что таймер насчитал 57 тиков. Получим
F = 100 000 000 / 57 = 1 754 385.
Две последние цифры ответа - дробная часть. Т.е. частота составит 17 543,85 Гц.

Конечно, пример привел экспромтптом. Он не оптимизирован. Округление чисел не учитывается. Но мне трудно самому подобрать соответствующий пример, поскольку такие задачи я не решал. Но, надеюсь, что мое решение поможет Вам! Удачи!
ARV
Цитата(sergeeff @ Jul 14 2011, 12:12) *
Наша маленькая слабость состоит в том, чтобы хоть как-то разбудить мыслительный процесс.
bb-offtopic.gif это я одобряю. но слабость в том, что вы делаете это слегка глумясь. надо подталкивать мысль в нужном направлении. можно было просто сказать: найдите и объясните разницу между 1/10 и 1.0/10 и тогда это было бы направлением, в котором человек мог бы копать. а сколько ни копай целочисленную арифметику, там не найдешь рассказов о float
sergeeff
Цитата(ARV @ Jul 14 2011, 12:35) *
а сколько ни копай целочисленную арифметику, там не найдешь рассказов о float


А вы еще не догадались, что она нецелочисленная арифметика вам не нужна?
sigmaN
так было же где-то в ветке АВР про частотомер страниц 20 минимум
ARV
Цитата(sergeeff @ Jul 14 2011, 15:58) *
А вы еще не догадались, что она нецелочисленная арифметика вам не нужна?
да я-то догадался:
Цитата
подумайте над следующим: если число 1,0003 заменить на "10003 и запятая после первого (левого) знака"... не подскажет ничего?
просто если автор тщетно пытался работать с плавучкой - надо было ему и подсказать, чем отличаются плавучие константы и целочисленные, а так же про явное и неявное преобразование типов... а нужна плавучка или нет - это решать автору, не так ли?
sigmaN
Цитата(smk @ Jul 13 2011, 18:45) *
Так хочется пристроить остатки tiny26. Уж не смейтесь...

Цитата
... а нужна плавучка или нет - это решать автору, не так ли?

но автор кажется не понимает, что ему не нужна(мягко говоря) эта плавучка на tiny ))
ARV
Цитата(sigmaN @ Jul 14 2011, 21:22) *
но автор кажется не понимает, что ему не нужна(мягко говоря) эта плавучка на tiny ))
это вторично - не наше с вами это дело. если мы можем - мы должны подсказать и объяснить, а разбираться и принимать решение - это оставим автору
sigmaN
Ну если прямо уж совсем корректно и правильно подходить к вопросу, то да - согласен.
sergeeff
Цитата(ARV @ Jul 14 2011, 20:44) *
это вторично - не наше с вами это дело. если мы можем - мы должны подсказать и объяснить, а разбираться и принимать решение - это оставим автору


Как обычно, автора давно уже нет, а копья ломают советчики.

А вас просто попутал с автором топика, извиняйте пожалуйста и не обессудьте.
smk
Автор есть. Получу результат на практике и напишу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.