You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.
Currently Firebird has two documented floating point datatypes:
- FLOAT (a 32 bit single precision)
- DOUBLE PRECISION (a 64 bit double precision)
Firebird also has the - undocumented - datatypes
- REAL (a 32 bit single precision), essentially an alias for FLOAT. REAL is a SQL standard type.
- LONG FLOAT (a 64 bit double precision), essentially an alias for DOUBLE PRECISION
In addition, Firebird supports - again, undocumented - FLOAT(p) with p in decimal precision, where
- p in [0,7] is a 32 bit single precision float
- p in [8,..) is a 64 bit double precision float
The SQL standard however defines FLOAT differently. From SQL:2016 6.1 <data type>:
20) If a <precision> is omitted, then an implementation-defined <precision> is implicit.
21) The value of a <precision> shall be greater than 0 (zero). [..]
29) FLOAT specifies the data type approximate numeric, with binary precision equal to or greater than the value of the specified <precision>. The maximum value of <precision> is implementation-defined. <precision> shall not be greater than this value.
30) REAL specifies the data type approximate numeric, with implementation-defined precision.
31) DOUBLE PRECISION specifies the data type approximate numeric, with implementation-defined precision that is greater than the implementation-defined precision of REAL.
32) For the <approximate numeric type>s FLOAT, REAL, and DOUBLE PRECISION, the maximum and minimum values of the exponent are implementation-defined.
I propose that for Firebird 4 we bring this inline with the standard:
1. Change and document FLOAT(p) to apply precision in binary digits, that is:
- p in [1, 24] is a 32 bit single precision
- p in [25, 53] is a 64 bit double precision
- p < 1 and p > 53 are an error (in the future we could consider adding support for higher precision formats like binary128 (p in [54, 113]) and binary256 (p in [114, 237]))
2. Document that FLOAT(p) with 1<=p<=24 is a synonym for FLOAT.
3. Document that FLOAT(p) with 25<=p<=53 is a synonym for DOUBLE PRECISION.
4. Document REAL as a synonym for FLOAT
5. Document LONG FLOAT and LONG FLOAT(p) with 1<=p<=53 as a deprecated synonym for DOUBLE PRECISION
This change will break backwards compatibility for FLOAT(p), but as the precision syntax for FLOAT was never documented, I think that is an acceptable tradeoff to gain better standard compliance.