Вопрос округления при конвертации в беззнаковый шорт

0

Я получаю неправильное значение при преобразовании 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, но все еще получал неправильный ответ

  • 0
    round должен дать правильный результат - вы уверены, что использовали его правильно?
  • 0
    Выглядит хорошо для меня (я использовал раунд для первого, но он вам нужен и для второго). Необходимость округления в первом случае обусловлена только радостями вычислений с плавающей запятой: 10.0 * 189.20 дает правильный ответ. Во втором случае это происходит из-за того, что приведение данных каким-то образом усекает данные, поэтому 1845,9 становится 1845.
Показать ещё 1 комментарий
Теги:
visual-c++

2 ответа

2
Лучший ответ

Если компилятор 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 которая позволяет точное представление для целых чисел), все же первый подход выглядит не очень удобно, потому что мы должны учитывать все эти предположения.

  • 0
    Мне действительно понравились эти данные = round (mData) * 100) / 100;
  • 0
    @Sijith Вам нужно округлить результат операции '/', а не один аргумент. (Кронштейны несбалансированы.)
Показать ещё 1 комментарий
0

что у меня 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню