2015-03-05 3 views
0

Я хочу, чтобы сохранить 16 MSB от значения греховной в короткой переменной, как:как сохранить значение греха в короткой переменной

short x =0; 
x = (short) (sin(3.14) >> 48); 

, так как возвращаемое значение греха в C является двойной. но это не работает, и я просто не понимаю! есть способ решить эту проблему или мне нужна дополнительная функция для этого

+0

как же это даже компилировать? 'sin (...)' возвращает 'double'. Вы не можете сдвинуть это ... –

+0

Он сказал, что это не работает. –

+1

Даже если это сработало: это должен быть сдвиг * слева *! – usr2564301

ответ

4

Поскольку sin(x) является всегда в [-1..1] диапазоне лучшее, что вы можете сделать, это

double arg = 3.14; // or whatever 
short x = (short) (sin(arg) * 32767); // 32767 is max short 

восстановления (когда вам нужно реальноsin значение)

double value = x/32767.0; // <- note the max short form: ".0" 
+0

Возможно, стоит упомянуть, что это в основном хранится как нотация с фиксированной точкой. Быстрый поиск в Google приведет к появлению большого количества ресурсов, которые могут быть полезны. – caveman

+0

Всегда? Нет, только если 'x' конечно. Я также рекомендую использовать 'SHRT_MAX' вместо' 32767'. Это более выразительно и не нуждается в дополнительном комментарии. – cremno

+0

@cremno, а затем отбрасывается при восстановлении 'double value = x/(double) SHRT_MAX;' –

0

Это потому, что sin(3.14) меньше, чем 1 . Только целая часть передается в x, и это 0.

Правый сдвиг 48 применяется к целому числу. Правое смещение 0 из 48 бит не улучшает его.

Что вы можете сделать, это следующее:

x = (short) (sin(3.14) *1000); 
Смежные вопросы