Because the double type stores a floating point number. Its significant numbers and order are stored separately. Unlike ordinary numbers, where the order is expressed by the number of zeros, which are significant digits.
Because of such a complicated way of storing a number, it is not possible to apply quick shift operations to it, because they will break everything. After all, they manipulate binary digits, and the order expresses the power of tens. This eliminates half the tricks for which implementing an unsigned type would be useful. The other half excludes the fact that it is not possible to perform modulo operations with floating numbers. As a result, an unsigned type is almost completely meaningless.
Of the benefits, only one bit per sign remains. Obviously, this was not enough for the processor developers to make the sign bit part of the number. They preferred to greatly simplify their lives and keep them separate. The developers of languages, on their own level, naturally, cannot effectively use this extra bit to store a meaningful digit.
The IEEE 754-2008 standard , which describes the format of floating-point numbers, prescribes that the character, module, and scale factor be stored separately:
For integers, the sign is stored and output implicitly, based on the characteristics of the overflow. For fractional numbers, the sign is written explicitly, which allows, by the way, to store also a negative zero, which is in demand in the mat. analysis.
Unfortunately for you, it will not be possible to get rid of the sign bit - you break the standard and the part of the processor responsible for fractional numbers simply won’t understand you. Because of this, you have to implement all the work with fractional numbers from scratch.