SALKA 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба Мне на BF532 надо иметь дело с плав. точкой. Применять эмуляцию, что предлагает VDSP, я боюсь, тк не знаю во что это обойдется по кол-ву лишних затраченный тактов. Собираюсь написать свой класс и представлять float, как два числа, одно LONG, другое ULONG. Первое определяет знак и содежимое до запятой, второе число определяет содежимое после запятой. Переполнения у меня не ожидаются, все результаты прогнозируются и находятся в отведенном диапазоне. Но алгоитм использующий double,не мой, он большой и передалать его на целые числа не имею возможности. Уместно ли идти по этому пути или лучше принять эмуляцию от VDSP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fontp 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба Мне на BF532 надо иметь дело с плав. точкой. Применять эмуляцию, что предлагает VDSP, я боюсь, тк не знаю во что это обойдется по кол-ву лишних затраченный тактов. Собираюсь написать свой класс и представлять float, как два числа, одно LONG, другое ULONG. Первое определяет знак и содежимое до запятой, второе число определяет содежимое после запятой. Переполнения у меня не ожидаются, все результаты прогнозируются и находятся в отведенном диапазоне. Но алгоитм использующий double,не мой, он большой и передалать его на целые числа не имею возможности. Уместно ли идти по этому пути или лучше принять эмуляцию от VDSP? Тема уже обсуждалась http://electronix.ru/forum/index.php?showtopic=45865 Application Note EE-185 в основном реализует Ваши намерения. Это будет быстрее, чем встроеный тип double. Можно пойти дальше и подправить их код и убрать оттуда разные проверки. Насколько это уместно? Зависит от нужного быстродействия. LONG на BF 32 бита. Посмотрите FastFloat32 в EE-185. Я ожидаю, что будет в 30-40 раз медленее такта процессора и раза в 3-4 быстее встроеного стандартного типа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Degun 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 (изменено) · Жалоба Мне на BF532 надо иметь дело с плав. точкой. Применять эмуляцию, что предлагает VDSP, я боюсь, тк не знаю во что это обойдется по кол-ву лишних затраченный тактов. Собираюсь написать свой класс и представлять float, как два числа, одно LONG, другое ULONG. Первое определяет знак и содежимое до запятой, второе число определяет содежимое после запятой. Переполнения у меня не ожидаются, все результаты прогнозируются и находятся в отведенном диапазоне. Но алгоитм использующий double,не мой, он большой и передалать его на целые числа не имею возможности. Уместно ли идти по этому пути или лучше принять эмуляцию от VDSP? Сейчас как раз думаю над этим вариантом. Возникает вопрос о его целесообразности, т. к. есть более простые и быстрые, но, соответственно, менее точные варианты реализации плавающей арифметики: http://www.koders.com/cpp/fid5E90955711BFB...1C652C383C.aspx http://electronix.ru/forum/index.php?showt...45865&st=26 Вообще же эти варианты работают значительно быстрее, чем эмуляция плавающей арифметики через компилятор. Для предлагаемого вами варианта необходима будет операция по суммированию двух чисел с учётом флага переноса, которой в C++ нет. Изменено 28 апреля, 2008 пользователем Degun Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALKA 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба Сейчас как раз думаю над этим вариантом. Возникает вопрос о его целесообразности, т. к. есть более простые и быстрые, но, соответственно, менее точные варианты реализации плавающей арифметики: http://www.koders.com/cpp/fid5E90955711BFB...1C652C383C.aspx http://electronix.ru/forum/index.php?showt...45865&st=26 Вообще же эти варианты работают значительно быстрее, чем эмуляция плавающей арифметики через компилятор. Для предлагаемого вами варианта необходима будет операция по суммированию двух чисел с учётом флага переноса, которой в C++ нет. а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)? На счет переноса в Си, то я планировал сделать вставку в ассемблере. Я не знаю ассемблер BF, но на intel и AVR такие комманды точно есть.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Degun 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)? А вы посмотрите по ссылкам: там плавающее число хранится в одной целочисленной переменной и запятая смещена относительно начала регистра на определённое кол-во бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALKA 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба А вы посмотрите по ссылкам: там плавающее число хранится в одной целочисленной переменной и запятая смещена относительно начала регистра на определённое кол-во бит. Я понимаю, что это тоже самое, просто одна переменная разделена на два числа??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба Не. В том варианте значительно больше динамический диапазон чисел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fontp 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)? Так это не floating point, это fixed point большой разрядности По реализации fixed point большой разрядности (на ассемблере) у AD тоже есть AN ee-186 Я понимаю, что это тоже самое, просто одна переменная разделена на два числа??? У него 48.16, а Вам хочется 32.32 enum { BITS = 32, RATIO = 4294967296 }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Degun 0 28 апреля, 2008 Опубликовано 28 апреля, 2008 · Жалоба Я понимаю, что это тоже самое, просто одна переменная разделена на два числа??? Да, т. е. для хранения целой и дробной частей числа отводятся разные биты одной и той же переменной длиной 64 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cioma 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Как уже упоминалось выше, не путайте формат представления числа с фиксированной и с плавающей точкой. Эти форматы принципиально различны: - Фиксированная точка: разрядная сетка условно разбивается на целую и дробную части. Целочисленное представление - это частный вариант представления с фиксированной запятой. Пример: 215.57 - Плавающая запятая: разрядная сетка разбивается на нормализованную мантиссу (значение числа в формате с одним разрядом в целой части) и порядок (степень базы системы счисления). Пример: 2.1557*10^2 - При прочих равных условиях формат с плавающей точкой дает больший диапазон (но не большую точность). - Плавающая точка требует значительно больше вычислений. - Большинство задач отлично ложатся на фиксированную точку с требуемой разрядностью. При этом про, собственно, "точку" можно забыть - считайте в целых числах, а точку представляйте мысленно (ну, и рисуйте при выводе если надо). Только не забудьте про переполнения разрядной сетки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Degun 0 3 мая, 2008 Опубликовано 3 мая, 2008 · Жалоба Как уже упоминалось выше, не путайте формат представления числа с фиксированной и с плавающей точкой. Эти форматы принципиально различны: Я думаю здесь все в курсе того, что формат с фиксированной запятой является всего лишь приближенным представлением действительного числа. Подробнее об этом можно прочитать, например, по ссылке ниже: http://matlab.exponenta.ru/fixedpoint/book1/1.php Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться