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

 
 
 
Reply to this topicStart new topic
> Keil mVision2 RV, плавающая точка
Sart
сообщение Oct 7 2008, 10:56
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



Здравствуйте.
Подскажите как armlink заставить изменить режим округления числа с плавающей точкой?
Go to the top of the page
 
+Quote Post
VAI
сообщение Oct 8 2008, 04:03
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вы можете сформулировать вопрос более грамотно.
Наверное Вы не совсем понимаете, что делает линкер...


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Sart
сообщение Oct 8 2008, 04:58
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



В Help я вычитал следующее:

"Note
The standard fplib libraries f* support only the Round to nearest rounding mode. If you require support for the other rounding modes, you must use the full IEEE g* libraries. See Library naming conventions."

Пошел смотреть Library naming conventions.

"Normally, you do not have to list any of these libraries explicitly on the linker command line. The ARM linker automatically selects the correct C or C++ libraries to use, and it might use several, based on the accumulation of the object attributes.

If library names are explicitly named in a makefile, you must rebuild your project as follows:

Remove the explicit references to the old library names from the linker command‑line.

Add ‑‑info libraries to the linker command‑line and rebuild the project. This produces a list of all the libraries in use.

Add the new list of libraries to the linker command‑line."

Но вот как конкретно выполнить эти инструкции я никак не пойму?
Подскажите, где я ошибаюсь или не понимаю, а лучше что конкретно сделать?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 8 2008, 09:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для подключения полных библиотек достаточно в опциях проекта на вкладке C/C++ в поле Misc controls дописать "--fpmode=ieee_full".
Go to the top of the page
 
+Quote Post
Sart
сообщение Oct 9 2008, 04:38
Сообщение #5





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



Большое спасибо. А подскажите еще как указать до какого знака после запятой округлять? Буду очень признателен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 9 2008, 04:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Тек-с. Вообще-то к какому-либо знаку после запятой это округление не относится:
Цитата
Arithmetic is generally performed by computing the result of an operation as if it were stored exactly (to infinite precision), and then rounding it to fit in the format. Apart from operations whose result already fits exactly into the format (such as adding 1.0 to 1.0), the correct answer is generally somewhere between two representable numbers in the format. The system then chooses one of these two numbers as the rounded result.


Задачу озвучте.
Go to the top of the page
 
+Quote Post
Sart
сообщение Oct 9 2008, 05:03
Сообщение #7





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



Проблема вот в чем:

В программе переменной типа float присваивается значение 0.1. Но вместо 0.1 реально после 9-го знака после запятой появляются цифры. В программе эта переменная является приращением некоторой величины. Но так как она не равна ровно 0.1 не выполняется условие if (величина == 5.0). Хотелось бы как то получить все таки ровно 0.1.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 9 2008, 05:09
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



В плавающей точке ровно обычно ничего не бывает. Поэтому использовать сравнения типа if(величина == 5.0) нельзя.
Go to the top of the page
 
+Quote Post
Sart
сообщение Oct 9 2008, 05:22
Сообщение #9





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



Соглашусь с Вами. Но как то указать компилятору что нужно округлять скажем до 3-го знака можно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 9 2008, 05:30
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет, можно только округлить вручную или придумать другое условие для сравнения.
Go to the top of the page
 
+Quote Post
Alexandro
сообщение Oct 9 2008, 05:48
Сообщение #11





Группа: Участник
Сообщений: 12
Регистрация: 26-05-05
Пользователь №: 5 431



Может это поможет:

убрать мусор из float

from: http://caxapa.ru/79045.html

Данный странный алгоритм убирает мусор из числа. Известно заранее, что числа "правильные" в некотором смысле.
Например - шаг шкалы оцифровки графика.

// Жила была переменная float
float Step=0.1; // или 1./3. или 2./3. или что нибудь похожее

// Её копируют в double, в результате в младших разрядах мусор 0.100000001490116 , 0.333333343267441 ...
double StepD=Step;

//Но мусор нам не нужен и его убираем
unsigned char *p=(unsigned char *)&StepD;
if(p[4]==p[5]) p[0]=p[1]=p[2]=p[3]=p[4];

// В результате получаем 0.1, 0.333333333333333 ...

Алгоритм используется в реальном проекте. Выглядит странно, но очень эфективен.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 9 2008, 06:16
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Sart @ Oct 9 2008, 09:22) *
Соглашусь с Вами. Но как то указать компилятору что нужно округлять скажем до 3-го знака можно?

ИМХО, это не есть работа компилятора.
Просто напишите if (fabs(val - 5.0f) < 0.001f) { ... }
Go to the top of the page
 
+Quote Post
VAI
сообщение Oct 9 2008, 08:55
Сообщение #13


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата
А подскажите еще как указать до какого знака после запятой округлять? Буду очень признателен.

Код

/* --- round() -------------------------------------------------------------------------------------------- **
*  value    - что округлять
*  accuracy - с какой точностью округлять
* -------------------------------------------------------------------------------------------------------- */
float round( float value, float accuracy )
{
  return( ((long)( value / accuracy + ( value < (float)0.0 ? (float)-0.5 : (float)0.5 ))) * accuracy );
}

accuracy - с какой точностью округлять:
0.01 - результат работы функции будет кратен 0.01, после запятой будет только 2 цифры.
0.024 - результат работы функции будет кратен 0.024, после запятой будет только 3 цифры.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Sart
сообщение Oct 9 2008, 10:39
Сообщение #14





Группа: Новичок
Сообщений: 10
Регистрация: 18-08-08
Пользователь №: 39 669



Я наверное неправильно выразился. Нужно как то указать компилятору сколько знаков после десятичной точки должно быть в числе.

В файле float.h определены дефайны вроде бы отвечающие за это. Поигрался с ними, но никаких изменнений не произошло.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 9 2008, 10:55
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sart @ Oct 9 2008, 14:39) *
Я наверное неправильно выразился. Нужно как то указать компилятору сколько знаков после десятичной точки должно быть в числе.

Этого сделать нельзя.

Цитата(Sart @ Oct 9 2008, 14:39) *
В файле float.h определены дефайны вроде бы отвечающие за это. Поигрался с ними, но никаких изменнений не произошло.

В этом файле перечислены параметры и пределы при работе с плавающей точкой, менять там что-либо бесполезно.
Go to the top of the page
 
+Quote Post

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

 


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


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