Я решил использовать декораторы для решения проблемы сериализации объекта datetime. Вот мой код:
#myjson.py
#Author: jmooremcc 7/16/2017
import json
from datetime import datetime, date, time, timedelta
"""
This module uses decorators to serialize date objects using json
The filename is myjson.py
In another module you simply add the following import statement:
from myjson import json
json.dumps and json.dump will then correctly serialize datetime and date
objects
"""
def json_serial(obj):
"""JSON serializer for objects not serializable by default json code"""
if isinstance(obj, (datetime, date)):
serial = str(obj)
return serial
raise TypeError ("Type %s not serializable" % type(obj))
def FixDumps(fn):
def hook(obj):
return fn(obj, default=json_serial)
return hook
def FixDump(fn):
def hook(obj, fp):
return fn(obj,fp, default=json_serial)
return hook
json.dumps=FixDumps(json.dumps)
json.dump=FixDump(json.dump)
if __name__=="__main__":
today=datetime.now()
data={'atime':today, 'greet':'Hello'}
str=json.dumps(data)
print str
Импортируя вышеуказанный модуль, мои другие модули используют json обычным способом (без указания ключевого слова по умолчанию) для сериализации данных, содержащих объекты времени даты. Код datetime serializer автоматически вызывается для json.dumps и json.dump.
It не, что большинство реализаций с плавающей точкой не соглашается, это просто, что они не могут заставить точность, необходимую получать 100%-й ответ. И корректный ответ - то, что они не могут.
PI является бесконечной серией цифр, которые никто не смог обозначить чем-либо кроме символьного представления, и e^X является тем же, и таким образом единственный способ добраться до 100%-й точности состоит в том, чтобы пойти символьный.
Вот короткий список реализаций и языков, которые я попробовал. Это отсортировано по близости с нулем:
(+ 1 (make-polar 1 (atan 0 -1)))
0.0+1.2246063538223773e-16i
(Схема Chez, Схема MIT) 0.0+1.22460635382238e-16i
(Хитрость) 0.0+1.22464679914735e-16i
(Курица с numbers
яйцо) 0.0+1.2246467991473532e-16i
(MzScheme, SISC, Неловкий, Гамбит) 0.0+1.2246467991473533e-16i
(SCM) (1+ (exp (complex 0 pi)))
#C(0.0L0 -5.0165576136843360246L-20)
(CLISP) #C(0.0d0 1.2246063538223773d-16)
(CMUCL) #C(0.0d0 1.2246467991473532d-16)
(SBCL) use Math::Complex; Math::Complex->emake(1, pi) + 1
1.22464679914735e-16i
from cmath import exp, pi; exp(complex(0, pi)) + 1
1.2246467991473532e-16j
(CPython) require 'complex'; Complex::polar(1, Math::PI) + 1
Complex(0.0, 1.22464679914735e-16)
(МРТ) Complex(0.0, 1.2246467991473532e-16)
(JRuby) complex(argument = pi) + 1
0+1.224606353822377e-16i
Действительно ли возможно урегулировать этот спор?
Моя первая мысль состоит в том, чтобы смотреть на символьный язык, как Клен . Я не думаю что количества как плавающая точка все же.
На самом деле, как каждый представляет я (или j для инженеров) на стандартном языке программирования?
, Возможно, лучшим примером является sin(ПЂ), = 0? (Или я упустил суть снова?)
Я соглашаюсь с Ryan, необходимо было бы переместиться в другую систему представления числа. Решение вне области математических операций с плавающей точкой, потому что Вам нужно пи к представленному как бесконечно длинное десятичное число, таким образом, любая ограниченная схема точности просто не собирается работать (по крайней мере, не используя некоторый фактор выдумки для составления потерянной точности).
Ваш вопрос кажется немного нечетным мне, поскольку Вы, кажется, предполагаете, что Математические операции с плавающей точкой реализованы языком. Это обычно не верно, поскольку математика FP сделана с помощью процессора для операций с плавающей точкой в аппаратных средствах. Но программное обеспечение или аппаратные средства, плавающая точка всегда будет неточна. Это, как работают плавания.
при необходимости в лучшей точности, необходимо использовать другое представление числа. Точно так же, как, если Вы делаете целочисленную математику на числах, которые не помещаются в интервал или долго. Некоторые языки имеют библиотеки для этого, встроил (я знаю, что Java имеет BigInteger и BigDecimal), но необходимо было бы явно пользоваться теми библиотеками вместо собственных типов, и производительность была бы (иногда значительно) хуже чем при использовании плаваний.
@Ryan Fox
На самом деле, как каждый представляет меня (или j для инженеров) на стандартном языке программирования?
Собственные сложные типы данных совсем не неизвестны. Фортран имел его к середине шестидесятых, и OP показывает множество других языков, которые поддерживают их в тсс продолжении.
И комплексные числа может быть добавлен к другим языкам как библиотеки (с перегрузкой оператора, они даже смотрят точно так же, как собственные типы в коде).
, Но если Вы не обеспечиваете особый случай для этой проблемы, "несоглашение" является просто выражением неточной арифметики машины, нет? Это похоже на жалобу что
float r = 2/3;
float s = 3*r;
float t = s - 2;
концы с (t! = 0) (По крайней мере, если Вы используете достаточно немой компилятор)...
На самом деле, как каждый представляет меня (или j для инженеров) на стандартном языке программирования?
На языке, который не имеет собственного представления, оно обычно добавляется с помощью ООП для создания Complex
класс для представления i
и j
с оператором, перегружающимся для надлежащего контакта с операциями, включающими другой Complex
числа и или другой собственный компонент примитивов числа языка.
, Например: Complex.java, C++ < комплекс>
Числовой Анализ учит нас, что Вы не можете полагаться на точное значение небольших различий между большими количествами.
Это только влияет на рассматриваемое уравнение здесь, но может принести нестабильность ко всему от решения почти исключительной системы одновременных уравнений, посредством нахождения нулей многочленов, к оценке журнала (~1) или exp (~0) (я даже видел специальные функции для оценки журнала (x+1) и (exp (x)-1) для обхода этого).
я поощрил бы Вас не думать с точки зрения обнуления различия - Вы не можете - а скорее в выполнении связанных вычислений таким способом как для обеспечения минимальной ошибки.
я сожалею, это - 43 года, с тех пор как мне вбили это в меня в uni, и даже если я мог бы помнить ссылки, я уверен, что существует лучший материал вокруг теперь. Я предлагаю это как начальная точка.
<час>, Если это звучит немного покровительственным, я приношу извинения. Мой "Числовой Анализ 101" был частью моего курса Химии, поскольку не было большого количества CS в те дни. У меня действительно нет чувства для места/важности, которое числовой анализ имеет в современном курсе CS.
Это ограничение наших текущих вычислительных архитектур с плавающей запятой. Арифметика с плавающей запятой - это только приближение числовых полюсов, таких как e или pi (или чего-либо, выходящего за рамки точности ваших битов). Мне очень нравятся эти числа, потому что они не поддаются классификации и, кажется, имеют большую энтропию (?), Чем даже простые числа, которые являются каноническим рядом. Числовое представление ratio defy, иногда такие простые вещи могут поразить человека (мне это нравится).
К счастью, целые языки и библиотеки могут быть посвящены прецизионным тригонометрическим функциям, используя нотационные концепции (аналогичные описанным в Лассе В. Карлсен ).
Рассмотрим библиотеку / язык, которые описывают такие понятия, как e и pi, в форме, понятной машине. Имеет ли машина представление о том, что такое идеальный круг? Возможно, нет, но мы можем создать объект - круг, который удовлетворяет всем известным характеристикам, которые мы приписываем ему (постоянный радиус, отношение радиуса к окружности равно 2 * pi * r = C). Такой объект, как пи, описывается только вышеупомянутым соотношением. r & C могут быть числовыми объектами, описываемыми любой точностью, которую вы хотите им придать. e можно определить, "поскольку e - уникальное действительное число такое, что значение производной (наклон касательной) функции f (x) = ex в точке x = 0 равно 1" из википедия .
Интересный вопрос.
Такой объект, как пи, описывается только вышеупомянутым соотношением. r & C могут быть числовыми объектами, описываемыми любой точностью, которую вы хотите им придать. e можно определить, "поскольку e является уникальным действительным числом такое, что значение производной (наклон касательной) функции f (x) = ex в точке x = 0 равно 1" из википедия .Интересный вопрос.
Такой объект, как пи, описывается только вышеупомянутым соотношением. r & C могут быть числовыми объектами, описываемыми любой точностью, которую вы хотите им придать. e можно определить, "поскольку e является уникальным действительным числом такое, что значение производной (наклон касательной) функции f (x) = ex в точке x = 0 равно 1" из википедия .Интересный вопрос.