Я получаю неправильное значение при преобразовании float в unsigned integer
TMAC_PAYLOAD_SCALE = 0.10
Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE);
189.20/0.10 = 1891 (I am expecting 1892)
184.59/0.10 = 1845 (I am expecting 1846)
Пробовал с функцией round и ceil, но все еще получал неправильный ответ
Если компилятор C++ использует IEEE 754, вы можете попробовать круглую функцию:
Data = (unsigned short)round(mData / TMAC_PAYLOAD_SCALE);
Однако, полагая, что результат деления неотрицателен, возможно, следующий подход:
Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE + 0.5);
Причина в том, что для преобразования с плавающим интегралом дробная часть просто отбрасывается. Поэтому, если функция округления не может представлять точное интегральное значение N
и возвращает значение "немного меньше", чем N
, то после литья получим N-1
.
Эта проблема может быть проиллюстрирована следующим (совместимым с IEEE 754) кодом:
int a = 16777217;
float f = a; // not double
int b = f;
cout << a << " " << b << endl;
которые выходят
16777217 16777216
Хотя описанная проблема не должна возникать в случае IEEE 754 и функции round
(так как round
return double
которая позволяет точное представление для целых чисел), все же первый подход выглядит не очень удобно, потому что мы должны учитывать все эти предположения.
что у меня tried-
#include <stdio.h>
#include<math.h>
int main ()
{
printf("%hd\n",(unsigned short)ceil(189.20/0.10)); // you can use ceilf also
printf("%hd\n",(unsigned short)floor(184.59/0.10));
return 0;
}
output-
root@sathish1:~/My Docs/Programs# ./a.out
1892
1845
round
должен дать правильный результат - вы уверены, что использовали его правильно?