сдвиг вправо на числа нецелых типов - PullRequest
5 голосов
/ 14 ноября 2010

у меня следующий код

#include <iostream>
using namespace std;
int main(){

float f=56.34f;
double d=12.34101;
cout<<(f>>1.0)<<endl;
cout<<(d>>1.0)<<endl;


return 0;
}

но это не работает и есть эта ошибка:

В функции 'int main ()': Строка 7: ошибка: недопустимые операнды типов «float» и «double» для двоичного «оператора >>» компиляция прекращена из-за ошибок -Wfatal.

Разрешено ли здесь смещение вправо в компиляторе C / C ++? Я использую Visual Studio 2010.

Ответы [ 5 ]

8 голосов
/ 14 ноября 2010

Это потому, что до тех пор, пока C ++ не будет перенесен на квантовые компьютеры , вы не сможете сдвинуться на половину бит .

Другими словами, для оператора битового смещения >> нет смысла поддерживать операнды с плавающей точкой. Тем не менее.

6 голосов
/ 14 ноября 2010

Вы не можете сдвигать нецелые типы. Это незаконно в C ++.

Если вы хотите умножить или разделить на две степени, просто сделайте это. Смещение не работает так на числах с плавающей запятой из-за способа их представления.

Если вы действительно хотите сместить битовую комбинацию чисел с плавающей запятой, то вам нужно будет выполнить кастинг или использовать объединение.

union
{
  float f;
  int i;
} u;
u.f = 56.34f;
u.i >>= 1;
cout << u.f << endl;

Но ценность, которую вы получаете, совершенно бессмысленна (вы не делите на 2).

1 голос
/ 14 ноября 2010

Нет, потому что двоичное представление чисел с плавающей точкой должно быть непрозрачным (и чтобы разделить его на 2, нужно уменьшить значение мантиссы).Вместо этого используйте *0.5f.

Если вы действительно хотите сместить двоичное представление (как в квадратном корне Quake), используйте union с unsigned.

0 голосов
/ 14 ноября 2010

Операторы сдвига определены только для целочисленных типов в C ++. Что бы вы ожидали в результате от 56.34 >> 1.0 в любом случае?

0 голосов
/ 14 ноября 2010

Почему вы хотите сдвинуть вправо двойной?Вместо этого вы можете f / 2.0, если вы этого хотите.

...