Существует значительная разница между целыми числами со знаком и без знака в C / C ++:
value >> shift
значения со знаком оставляют верхний бит неизменным (расширение знака), значения без знака очищают верхний бит.
Причина отсутствия неподписанного числа с плавающей запятой заключается в том, что вы быстро сталкиваетесь со всевозможными проблемами, если нет отрицательных значений. Учтите это:
float a = 2.0f, b = 10.0f, c;
c = a - b;
Какое значение имеет c? -8. Но что бы это значило в системе без отрицательных чисел. FLOAT_MAX - 8 возможно? На самом деле, это не работает, так как FLOAT_MAX - это FLOAT_MAX из-за точных эффектов, поэтому все становится еще сложнее. Что, если это было частью более сложного выражения:
float a = 2.0f, b = 10.0f, c = 20.0f, d = 3.14159f, e;
e = (a - b) / d + c;
Это не проблема для целых чисел из-за природы системы дополнения 2.
Также рассмотрим стандартные математические функции: sin, cos и tan будут работать только для половины их входных значений, вы не можете найти журнал значений <1, вы не можете решить квадратные уравнения: x = (-b + / - root (bb - 4.ac)) / 2.a и т. д. Фактически, это, вероятно, не будет работать для любой сложной функции, поскольку они, как правило, реализуются в виде полиномиальных приближений, которые где-то будут использовать отрицательные значения. </p>
Таким образом, беззнаковые поплавки довольно бесполезны.
Но это не значит, что класс, который проверяет значения с плавающей запятой, бесполезен, вы можете захотеть ограничить значения определенным диапазоном, например, вычисления RGB.