Числа с плавающей запятой в Python «float» и PostgreSQL «с двойной точностью»

Основаны ли типы Python «float» и PostgreSQL с «двойной точностью» на одной и той же реализации C? Возможно, это не настоящая основная проблема, но в любом случае вот что я получаю, когда пытаюсь манипулировать небольшими числами в обеих средах:

На Python (2.7.2 GCC 4.2.1, если это актуально):

>>> float('1e-310')
1e-310

В PostgreSQL (9.1.1):

postgres# select 1e-310::double precision;
ERROR:  "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" is out of range for type double precision

Насколько я понимаю, тип с плавающей запятой Python "обрабатывает" 1e-310, а тип PostgreSQL с двойной точностью - нет. Документы Python и PostgreSQL по типам «float» и «двойной точности» соответственно относятся к стандарту IEEE 754, который предполагается реализовать на «большинстве платформ» ( Я использую OS X Lion 10.7.3).

Может ли кто-нибудь объяснить, что здесь происходит? И дайте мне решение, я бы хотел, например, «уменьшить» точность Python, чтобы я мог вставлять числа с плавающей запятой в свою базу данных через Django FloatField. (Полный вариант использования состоит в том, что я читаю цифры из файла, а затем вставляю их).

Некоторая (возможно, интересная) дополнительная информация на Python:

>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
>>> 1e-320.__sizeof__()
24

Я действительно не понимаю второй.

6
задан Arthur 4 March 2012 в 16:24
поделиться