2013-10-02 2 views
1

Воспользовавшись C#, я был удивлен, обнаружив, что у C++ floats не был определен оператор модуля. По-видимому, и побитовые операторы. Я решил узнать больше и пошел искать диаграмму, для которой базовые типы определяли для них операторы, а какие нет, но я не мог найти ничего такого.Какие операторы определены для каждого из базовых типов?

Я знаю, что все операторы и как перегрузить их: http://en.wikipedia.org/wiki/C%2B%2B_operators

Я, однако, не знаю, какие операторы определены для каждого из базовых типов.

+2

Разве это не в спецификации языка? Возможно, не все в одном месте, но если вы посмотрите в разделе каждого типа, я ожидаю, что он скажет, какие операторы определены. – Barmar

+0

использовать fmod() для модуля с плавающей точкой. И побитовые операторы будут слишком специфичны для вашего представления с плавающей запятой (распределение между мантиссой и экспонентом, которое многие ОС позволяют вам изменять во время выполнения). – Bathsheba

+0

@Bathsheba Какая ОС позволяет вам это сделать? Я его никогда не видел. Плавающая точка определяется IEEE 754 и оборудованием, а не операционной системой. – EJP

ответ

1

Все операторы определены для целочисленных типов (char, short, int, long, long long и enum). Для плавающих типов (float, double и long double), вы не имеете % и ни один из «поразрядными» операторов: <<, >>, ~, &, | и ^, так как они не имеют особого смысла для чисел с плавающей точкой , Например, что вы ожидаете от 3.3^6.8? [1] Или 1.9 % 13.4? [1] В делении с плавающей точкой нет «остатка», поэтому трудно предугадать то, что оно на самом деле должно дать.

Как упоминалось в комментарии, fmod делает аналогичную вещь с %.

[1] Это риторические вопросы, я не ожидаю, что кто-нибудь придумает хороший ответ.

+0

Re [1]: люди придумали ответ, следовательно, «fmod». –

+0

В соответствии с этим вопросом и его ссылкой: http://stackoverflow.com/questions/1723575/how-to-perform-a-bitwise-operation-on-floating-point-numbers Побитовые операции могут быть полезны для с плавающей запятой числа в генетических алгоритмах. Я бы предположил, что поплавки будут поддерживать побитовые операции по умолчанию. Что-то вроде: reinterpret_cast float1 (побитовая операция) reinterpret_cast float2 – Limne

+0

Да, манипулирование компонентами числа с плавающей запятой с побитовыми операциями будет действительным. сделать 32-бит float отрицательным: float f; f = 8,3f; * reinterpret_cast (& f) | = 0x80000000; '- или можно манипулировать мантиссой, чтобы округлить ее вверх/вниз, изменив младший бит или умножьте на два, извлекая и добавив один к экспоненте. Но это не использует манипуляции с битами по номерам с плавающей точкой - это изменение битов в числе с плавающей запятой, как если бы оно было целым числом (или набором целочисленных полей, действительно). –

Смежные вопросы