I’m wondering if a number is represented one way in a floating point representation, is it going to be represented in the same way in a representation that has a larger size.
That is, if a number has a particular representation as a float, will it have the same representation if that float is cast to a double and then still the same when cast to a long double.
I’m wondering because I’m writing a BigInteger implementation and any floating point number that is passed in I am sending to a function that accepts a long double to convert it. Which leads me to my next question. Obviously floating points do not always have exact representations, so in my BigInteger class what should I be attempting to represent when given a float. Is it reasonable to try and represent the same number as given by std::cout << std::fixed << someFloat; even if that is not the same as the number passed in. Is that the most accurate representation I will be able to get? If so, …
What’s the best way to extract that value (in base some power of 10), at the moment I’m just grabbing it as a string and passing it to my string constructor. This will work, but I can’t help but feel theres a better way, but certainly taking the remainder when dividing by my base is not accurate with floats.
Finally, I wonder if there is a floating point equivalent of uintmax_t, that is a typename that will always be the largest floating point type on a system, or is there no point because long double will always be the largest (even if it ‘s the same as a double).
Thanks, T.
If by “same representation” you mean “exactly the same binary representation in memory except for padding”, then no. Double-precision has more bits of both exponent and mantissa, and also has a different exponent bias. But I believe that any single-precision value is exactly representable in double-precision (except possibly denormalised values).
I’m not sure what you mean when you say “floating points do not always have exact representations”. Certainly, not all decimal floating-point values have exact binary floating-point values (and vice versa), but I’m not sure that’s a problem here. So long as your floating-point input has no fractional part, then a suitably large “BigInteger” format should be able to represent it exactly.
Conversion via a base-10 representation is not the way to go. In theory, all you need is a bit-array of length ~1024, initialise it all to zero, and then shift the mantissa bits in by the exponent value. But without knowing more about your implementation, there’s not a lot more I can suggest!