Перейти к содержанию
    

Floating point на BLACKFINе

Мне на BF532 надо иметь дело с плав. точкой. Применять эмуляцию, что предлагает VDSP, я боюсь, тк не знаю во что это обойдется по кол-ву лишних затраченный тактов.

Собираюсь написать свой класс и представлять float, как два числа, одно LONG, другое ULONG. Первое определяет знак и содежимое до запятой, второе число определяет содежимое после запятой.

Переполнения у меня не ожидаются, все результаты прогнозируются и находятся в отведенном диапазоне. Но алгоитм использующий double,не мой, он большой и передалать его на целые числа не имею возможности.

 

Уместно ли идти по этому пути или лучше принять эмуляцию от VDSP?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне на 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 быстее встроеного стандартного типа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне на 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++ нет.

Изменено пользователем Degun

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас как раз думаю над этим вариантом. Возникает вопрос о его целесообразности, т. к. есть более простые и быстрые, но, соответственно, менее точные варианты реализации плавающей арифметики:

http://www.koders.com/cpp/fid5E90955711BFB...1C652C383C.aspx

http://electronix.ru/forum/index.php?showt...45865&st=26

Вообще же эти варианты работают значительно быстрее, чем эмуляция плавающей арифметики через компилятор.

Для предлагаемого вами варианта необходима будет операция по суммированию двух чисел с учётом флага переноса, которой в C++ нет.

 

а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)?

На счет переноса в Си, то я планировал сделать вставку в ассемблере. Я не знаю ассемблер BF, но на intel и AVR такие комманды точно есть..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)?

А вы посмотрите по ссылкам: там плавающее число хранится в одной целочисленной переменной и запятая смещена относительно начала регистра на определённое кол-во бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы посмотрите по ссылкам: там плавающее число хранится в одной целочисленной переменной и запятая смещена относительно начала регистра на определённое кол-во бит.

Я понимаю, что это тоже самое, просто одна переменная разделена на два числа???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не. В том варианте значительно больше динамический диапазон чисел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а какой вариант может быть быстрее, чем представлять floating point двумя числами (до запятой, после запятой)?

 

Так это не floating point, это fixed point большой разрядности

По реализации fixed point большой разрядности (на ассемблере) у AD тоже есть AN

ee-186

 

 

Я понимаю, что это тоже самое, просто одна переменная разделена на два числа???

 

У него 48.16, а Вам хочется 32.32

enum { BITS = 32, RATIO = 4294967296 };

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я понимаю, что это тоже самое, просто одна переменная разделена на два числа???

Да, т. е. для хранения целой и дробной частей числа отводятся разные биты одной и той же переменной длиной 64 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как уже упоминалось выше, не путайте формат представления числа с фиксированной и с плавающей точкой. Эти форматы принципиально различны:

 

- Фиксированная точка: разрядная сетка условно разбивается на целую и дробную части. Целочисленное представление - это частный вариант представления с фиксированной запятой. Пример: 215.57

 

- Плавающая запятая: разрядная сетка разбивается на нормализованную мантиссу (значение числа в формате с одним разрядом в целой части) и порядок (степень базы системы счисления). Пример: 2.1557*10^2

 

- При прочих равных условиях формат с плавающей точкой дает больший диапазон (но не большую точность).

 

- Плавающая точка требует значительно больше вычислений.

 

- Большинство задач отлично ложатся на фиксированную точку с требуемой разрядностью. При этом про, собственно, "точку" можно забыть - считайте в целых числах, а точку представляйте мысленно (ну, и рисуйте при выводе если надо). Только не забудьте про переполнения разрядной сетки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как уже упоминалось выше, не путайте формат представления числа с фиксированной и с плавающей точкой. Эти форматы принципиально различны:

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

http://matlab.exponenta.ru/fixedpoint/book1/1.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...