Harvester 0 9 февраля, 2006 Опубликовано 9 февраля, 2006 · Жалоба Впервые использовал float и возник следующий вопрос. Берем число (от фонаря): -362.0927, в HEX - C3B50BDE пересылаем эти байты по UART в PC, получаем -362.0927124 (программа на Visual C++). Это нормально? Вроде бы формат хранения float в обеих компиляторах один и тот же (IEEE), тогда почему отличаются числа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 9 февраля, 2006 Опубликовано 9 февраля, 2006 · Жалоба В Вашем случае не знаю, формат хранения зависит от компилятора. Посмотрите как нужное Вам числи выглядит в Visual C++. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 9 февраля, 2006 Опубликовано 9 февраля, 2006 · Жалоба я ввел C3B50BDE в память в CCS3.0. переключила на 32bit floating point, получил: -362.0927 переключил на 32bit exponential float, получил: -3.6209271e+02 64bit floating point - получается не очень похожее: 6.953518030444701e-3 посмотрите в опциях компилятора. может дело в формате представления Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ek74 0 9 февраля, 2006 Опубликовано 9 февраля, 2006 · Жалоба Так и должно быть, т.к. по стандарту IEEE 754 тип float имеет следующее представление: 1 бит - знак 8 бит - порядок 23 бита - мантисса Для представления точного значения Вашего числа (-362.0927) не хватает разрядности мантиссы. Попробуйте в Visual C++ следующий код: float f = -362.0927; printf("%f\n", f); результат будет: -362.092712 Если Вы хотите иметь более точное представление, то используйте double: 1 бит - знак 11 бит - порядок 52 бита - мантисса Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 9 февраля, 2006 Опубликовано 9 февраля, 2006 · Жалоба Спасибо! В общем-то я так и предполагал, но мне казалось, что 23 бит мантиссы достаточно для 4-х знаков после запятой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ek74 0 10 февраля, 2006 Опубликовано 10 февраля, 2006 · Жалоба В общем-то я так и предполагал, но мне казалось, что 23 бит мантиссы достаточно для 4-х знаков после запятой. Поскольку формат IEEE подраземевает следующее представление числа n = (–1)^s * 2^(e–127) * 1.f, где s - знак, e - порядок, f - мантисса, т.е. число нормализованное, то биты образующие целую часть, тоже "уходят" в мантиссу. Так что реально после запятой получается гораздо больше знаков чем 4. Отсюда вытекает, что чем больше будет целая часть, тем менее точно будет представленна дробная часть числа :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться