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

Тип float в IAR C

Впервые использовал float и возник следующий вопрос.

Берем число (от фонаря): -362.0927, в HEX - C3B50BDE

пересылаем эти байты по UART в PC, получаем -362.0927124 (программа на Visual C++).

 

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

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


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

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

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


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

я ввел C3B50BDE в память в CCS3.0.

переключила на 32bit floating point, получил: -362.0927

переключил на 32bit exponential float, получил: -3.6209271e+02

64bit floating point - получается не очень похожее: 6.953518030444701e-3

посмотрите в опциях компилятора. может дело в формате представления

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


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

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

1 бит - знак

8 бит - порядок

23 бита - мантисса

 

Для представления точного значения Вашего числа (-362.0927) не хватает разрядности мантиссы. Попробуйте в Visual C++ следующий код:

float f = -362.0927;
printf("%f\n", f);

 

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

 

Если Вы хотите иметь более точное представление, то используйте double:

1 бит - знак

11 бит - порядок

52 бита - мантисса

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


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

Спасибо!

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

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


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

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

 

Поскольку формат IEEE подраземевает следующее представление числа n = (–1)^s * 2^(e–127) * 1.f,

где s - знак, e - порядок, f - мантисса, т.е. число нормализованное, то биты образующие целую часть, тоже "уходят" в мантиссу. Так что реально после запятой получается гораздо больше знаков чем 4.

 

Отсюда вытекает, что чем больше будет целая часть, тем менее точно будет представленна дробная часть числа :(

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


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

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

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

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

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

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

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

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

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

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