23

When casting double infinity to float and vice versa, will it still be infinity? Is it the same with NaN?

Peter Cordes
  • 328,167
  • 45
  • 605
  • 847
Evgeny
  • 2,121
  • 1
  • 20
  • 31
  • 2
    related/dupe: https://stackoverflow.com/questions/14773142/is-a-float-guaranteed-to-be-preserved-when-transported-through-a-double-in-c-c – NathanOliver Apr 06 '21 at 13:05
  • 6
    @NathanOliver: Strictly speaking that covers only half the cases asked here. In IEEE754, there are many more 64-bit NaN's than there are 32 bit NaN's, so it matters if you start with 32 or 64 bits. The linked question assumes you start with 32 bits; this question also considers the case where you start with one of the 64 bit NaN's. And since there are more than 4 billion 64-bit NaN's, the pigeonhole principle tells us that you cannot preserve the NaN **payload** (the exact binary NaN representation) – MSalters Apr 06 '21 at 19:13

1 Answers1

27

Converting any float to a double is guaranteed to preserve the value. Converting a double to float is guaranteed to preserve the value if the original value is representable as float.

If your system conforms to IEEE-754, then float is able to represent infinity and NaN. Otherwise, you can use <numeric_limits> to check whether that is the case. The payload of a double NaN is not necessarily representable by a float NaN.

eerorika
  • 232,697
  • 12
  • 197
  • 326
  • 8
    There may be no support for NaN payloads, because that is an *optional* feature in IEEE-754 (a should-provision, not a shall-provision). For example, when running CUDA on a GPU, the double-precision hardware supports NaN payloads, while single-precision hardware produces a single canonical NaN (`0x7fffffff`). But in a `double` to `float` conversion, a NaN stays NaN. – njuffa Apr 06 '21 at 21:32