forked from fixin.me/fixin.me
35 lines
1.9 KiB
Markdown
35 lines
1.9 KiB
Markdown
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
|
|
`decimal` data type with the lowest precision, equal to the precision of
|
|
`REAL` type (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)
|
|
* 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 `BigDecimal` type
|