Плавающая переменная двойной точности на любом языке, тем не менее, может достигать ± 1.79769313486231570e + 308, поэтому она определенно может принимать все значения, которые может использовать 128-битное целое число, и даже больше.
Это предположение неверно. Переменная с плавающей запятой двойной точности может не принимать все значения, которые может использовать 128-битное целое число.
Это потому, что тип с плавающей запятой в информатике имеет ограниченную точность. Как только вы доберетесь до чисел больше 2 ^ 52, вы больше не сможете представлять отдельные целые числа в этом диапазоне. Вы ограничены 2 ^ 52, 2 ^ 52 + 2, 2 ^ 52 + 4, 2 ^ 52 + 6, ... пока не достигнете 2 ^ 53, и в этот момент вы потеряете большую точность, представляя только значения 2 ^ 53, 2 ^ 53 + 4, 2 ^ 53 + 8, 2 ^ 53 + 12, ...
Так что, если, скажем, ваш IPv6-адрес равен 2 ^ 52 + 1, double
не сможет его представить.
Так что нет, невозможно представить весь диапазон адресов IPv6 в пространстве, определенном 64-битным значением с плавающей запятой double
.
См. Математика с плавающей точкой сломана? для более подробного описания того, как математика с плавающей точкой работает в компьютерах.
Частью вашей проблемы является некоторая путаница между типами. Тип DECIMAL
в информатике - это не тот же тип, что и тип double
. decimal
типы - это, как правило, реализация BigNum. Они, вероятно, могут хранить весь адрес IPv6, но он не собирается делать это только в 64-битной версии. Он будет использовать любое количество бит, необходимое для реализации базы данных (вероятно, более 128 бит, поскольку decimal
обычно предназначен для обработки математики с фиксированной запятой).
Если вам нужно сохранить IPv6-адрес в базе данных, вы могли бы быть в состоянии обойтись без него с типом decimal(39)
, но для безопасности вам следует использовать один из них вместо :
- 128-битное целочисленное поле явного размера
- 16-байтовое
VARCHAR
(или другое строковое поле), которое сохраняет 8 битов на символ
- 64-байтовое поле
VARCHAR
, которое сохраняет IP-адрес в шестнадцатеричной строке (например, как они обычно представлены).
- 22-байтовое
VARCHAR
поле, которое сохраняет IP-адрес в BASE64-кодированной строке