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

 
 
> Тип float в IAR C
Harvester
сообщение Feb 9 2006, 10:46
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Впервые использовал float и возник следующий вопрос.
Берем число (от фонаря): -362.0927, в HEX - C3B50BDE
пересылаем эти байты по UART в PC, получаем -362.0927124 (программа на Visual C++).

Это нормально? Вроде бы формат хранения float в обеих компиляторах один и тот же (IEEE), тогда почему отличаются числа?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
arttab
сообщение Feb 9 2006, 10:53
Сообщение #2


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



В Вашем случае не знаю, формат хранения зависит от компилятора. Посмотрите как нужное Вам числи выглядит в Visual C++.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
bav
сообщение Feb 9 2006, 11:28
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



я ввел C3B50BDE в память в CCS3.0.
переключила на 32bit floating point, получил: -362.0927
переключил на 32bit exponential float, получил: -3.6209271e+02
64bit floating point - получается не очень похожее: 6.953518030444701e-3
посмотрите в опциях компилятора. может дело в формате представления
Go to the top of the page
 
+Quote Post
ek74
сообщение Feb 9 2006, 11:38
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Так и должно быть, т.к. по стандарту IEEE 754 тип float имеет следующее представление:
1 бит - знак
8 бит - порядок
23 бита - мантисса

Для представления точного значения Вашего числа (-362.0927) не хватает разрядности мантиссы. Попробуйте в Visual C++ следующий код:
Код
float f = -362.0927;
printf("%f\n", f);


результат будет: -362.092712

Если Вы хотите иметь более точное представление, то используйте double:
1 бит - знак
11 бит - порядок
52 бита - мантисса
Go to the top of the page
 
+Quote Post
Harvester
сообщение Feb 9 2006, 11:58
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Спасибо!
В общем-то я так и предполагал, но мне казалось, что 23 бит мантиссы достаточно для 4-х знаков после запятой.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
ek74
сообщение Feb 10 2006, 08:40
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Цитата(Harvester @ Feb 9 2006, 14:58) *
В общем-то я так и предполагал, но мне казалось, что 23 бит мантиссы достаточно для 4-х знаков после запятой.


Поскольку формат IEEE подраземевает следующее представление числа n = (–1)^s * 2^(e–127) * 1.f,
где s - знак, e - порядок, f - мантисса, т.е. число нормализованное, то биты образующие целую часть, тоже "уходят" в мантиссу. Так что реально после запятой получается гораздо больше знаков чем 4.

Отсюда вытекает, что чем больше будет целая часть, тем менее точно будет представленна дробная часть числа sad.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:01
Рейтинг@Mail.ru


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