3 ms·
Serialization of floating point number makes some sense. Even if you can't reliably read it on other machine, reading it on the same machine should be possible.
by vbezhenar 3y ago
Serialization of floating point number makes some sense. Even if you can't reliably read it on other machine, reading it on the same machine should be possible.
- yvdriess 3y agoYes, being able to fwrite() dump floats to binaries is invaluable when working with large datasets. It's common to see binary 'cache' file being created for ASCII inputs (e.g. CSV) when there is any chance of it being fed repeatedly.
- pif 3y ago> fwrite() dump floats to binaries That requires a cast from float* to void*. Reading the floating point number as an integer is not necessary.
- yvdriess 3y agoAFAIK the underlying mechanism and undefined behaviour is the same.
- pif 3y agoNo, it isn't! Casting any object pointer to (and from) void* or char* is guaranteed to work, while float to integer incurs in the undefined behaviour curse.
- yvdriess 3y agoDo I understand you right that for (int i=0; i<4; i++) buf[i] = ((char*)&my_float)[i]; is not undefined behavior? But that for (int i=0; i<4; i++) buf[i] = ((char*)(int32_t*)&my_float)[i]; is undefined?
- pif 3y agoI'm not sure 100%, but your second example does not imply UB. UB is caused by the act of accessing an object via a pointer of the wrong type, but just casting a pointer as you do should not be a problem. On the other side, this would incur UB: int32_t my_int = *((int32_t*)&my_float);
- pif 3y agoSerialization of floating point number makes a lot of sense. But you don't need to read it as an integer.
- 0xf00ff00f 3y agoWhat if you need to do an endianness conversion?
- pif 3y agoIn that case, you need a cast from float* to char*, which is guaranteed to work. There is no sane reason to want to access a float as an integer.
- gpderetta 3y agoI'll just leave this here: https://en.wikipedia.org/wiki/Fast_inverse_square_root https://en.wikipedia.org/wiki/Fast_inverse_square_root
- CyberDildonics 3y agoThey said sane reason and that most programmers would never need to do it. I don't think the magic inverse square root contradicts that.
- pif 3y agoI stand corrected: there is one very good reason to want to treat a float like an integer. But if you can come up with such a solution, you are definitely not one to stop at their first guess, and you'll double-check the standard before the final commit.
- gpderetta 3y agoOk, what about: https://leonardschuetz.ch/blog/nan-boxing/ https://leonardschuetz.ch/blog/nan-boxing/