2010-08-28 2 views
12

Можно создать дубликат:
Why doesn't C have unsigned floats?Почему нет неподписанных типов с плавающей запятой?

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

$ 3.9.1/8- "Там три плавающих типов точек: с плавающей точкой, двойной и длинный двойной".

+0

@Greg Hewgill: Да, изменил название приятеля. – Chubsdad

+0

@Greg Hewgill: обновлено в соответствии с вашими комментариями. – Chubsdad

+0

Литералы с плавающей точкой всегда подписываются в терминах * type *. Независимо от того, явно ли вы префикс с +/- не меняет этого и суффикс с U или LU, как если бы целочисленный литерал для принуждения типа был ошибкой. – Clifford

ответ

22

Целочисленные типы без знака имеют два важных свойства, которые отличает их от целочисленных типов со знаком: «сдвинутый» диапазон (без отрицательного поддиапазона, а положительный поддиапазон в два раза шире) и по модулю арифметики. Для целых типов эти свойства достаточно важны, чтобы оправдать существование неподписанных типов.

С плавающими типами ни одно из этих свойств не применяется немедленно. С типами с плавающей точкой основная проблема не в их диапазоне (для многих целей ее можно рассматривать как практически бесконечную), а скорее в точности. А модульная арифметика естественно не применима к нецелочисленным типам. По этой причине было бессмысленно вводить неподписанные типы с плавающей точкой, т. Е. Не имело большого смысла перевернуть роль только одного бита в представлении с плавающей запятой.

Следует также отметить, что приведенные выше рассуждения, вероятно, следует использовать в качестве обоснования для внедрения целочисленных типов без знака (а не для внедрения неподписанных типов с плавающей точкой) в популярное оборудование и соответствующие аппаратные производные стандарты. То, что мы имеем в C и C++, было по существу унаследовано от аппаратных возможностей и этих стандартов.

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

+0

Принимая этот ответ для последнего утверждения: «Конечно, из концептуальной точки зрения, было бы вполне логично иметь беззнаковые типы с плавающей запятой в языке, только ради последовательности, но, увы, их там нет ». Также рассуждения о «достаточно важном для оправдания существования» кажутся правильными, хотя я не являюсь экспертом в C++ – Chubsdad

+0

. Стоит отметить, что поведение вычитания большего значения без знака из более мелкого четко определено, но есть нет четкого значения для вычитания большего поплавка из меньшего, кроме сообщения об отрицательном результате. – supercat

6

Все плавающие точки подписаны. C++ следует за стандартом IEEE 754, который является наиболее распространенной аппаратной реализацией и следует за ним, поплавки всегда подписываются.

Поскольку поплавки уже занимают не менее 32 бит, выигрыш в реализации программного обеспечения, который восстановит этот 1 бит, незначителен по сравнению с полезностью такой реализации.

+1

Я бы опустил «по умолчанию», так как альтернативы нет. –

+0

В основном я искал способ избежать переменной типа double/float от отрицательного значения, произнеся что-то вроде «unsigned double» – Chubsdad

+0

@Greg, исправлено. –

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