forked from fixin.me/fixin.me
1.9 KiB
1.9 KiB
DESIGN
Below is a list of design decisions. The justification is to be consulted whenever a change is considered, to avoid regressions.
Data type for DB storage of numeric values (decimal vs float)
- among database engines supported (by Rails), SQLite offers storage of
decimaldata type with the lowest precision, equal to the precision ofREALtype (double precision float value, IEEE 754), but in a floating point format,- decimal types in other database engines offer greater precision, but store data in a fixed point format,
- biology-related values differ by several orders of magnitude; storing them in
fixed point format would only make sense if required precision would be
greater than that offered by floating point format,
- even then, fixed point would mean either bigger memory requirements or
worse precision for numbers close to scale limit,
- for a fixed point format to use the same 8 bytes of storage as IEEE 754, precision would need to be limited to 18 digits (4 bytes/9 digits) and scale approximately half of that - 9,
- double precision floating point guarantees 15 digits of precision, which
is more than enough for all expected use cases,
- single precision floating point only guarntees 6 digits of precision, which is estimated to be too low for some use cases (e.g. storing latitude/longitude with a resolution grater than 100m)
- even then, fixed point would mean either bigger memory requirements or
worse precision for numbers close to scale limit,
- double precision floating point (IEEE 754) is a standard that ensures
compatibility with all database engines,
- the same data format is used internally by Ruby as a
Float; it guarantees no conversions between storage and computation, - as a standard with hardware implementations ensures both: computing
efficiency and hardware/3rd party library compatibility as opposed to Ruby
custom
BigDecimaltype
- the same data format is used internally by Ruby as a