in reply to Re^8: Introspection into floats/NV
in thread Introspection into floats/NV
I'm not a C programmer
C doesn't mandate the size or format of float, double or long double. Some or all of these might even be optional to implement.
Unfortunately, there is no mention of the FP80 format you mentioned in another thread.
Wikipedia's Extended_precision#x86_extended-precision_format says
"The x86 extended-precision format is an 80-bit format first implemented in the Intel 8087 math coprocessor and is supported by all processors that are based on the x86 design that incorporate a floating-point unit (FPU)."
gcc makes these available as __float80 on x86-64 machines.
F will produce f,d or D according to the setting.
NV (F) is user-defined, and it isn't limited to be one of float (f), double (d) or long double (D).
For example, someone using gcc on a modern x86-64 (i.e. nearly everyone) could build a Perl with the following types:
| pack format | C type | What it is |
|---|---|---|
| f | float | IEEE single |
| d | double | IEEE double |
| D | long double | IEEE quad |
| F | NV = __float80 | Intel 80-bit extended precision |
It would be an unusual choice since __float80 is padded to 16 bytes, the same size as the also-supported IEEE quad.
Will F return another bitlength?
It can.
In that setup described, it would return the same byte length as D since __float80 is padded to 16 bytes, but it would be a different format that D.
if F returns different bit length it's possible to tell that it's not a FP64. It might be much trickier to tell if its according to IEEE though (i.e. position and format of sign and exponent)
Exactly. It's easy to tell that a (say) 10-byte format isn't an one of the IEEE formats, but distinguishing a __float80 from an IEEE quad is harder.
Updated based on new knowledge of about the 80-bit floats.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^10: Introspection into floats/NV
by LanX (Saint) on Jun 05, 2025 at 15:25 UTC |