Немного диверсии в плавающую точку (im) точность, часть 1

Я решил использовать декораторы для решения проблемы сериализации объекта 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.

20
задан CloudyMarble 7 February 2013 в 13:16
поделиться

9 ответов

It не, что большинство реализаций с плавающей точкой не соглашается, это просто, что они не могут заставить точность, необходимую получать 100%-й ответ. И корректный ответ - то, что они не могут.

PI является бесконечной серией цифр, которые никто не смог обозначить чем-либо кроме символьного представления, и e^X является тем же, и таким образом единственный способ добраться до 100%-й точности состоит в том, чтобы пойти символьный.

17
ответ дан 29 November 2019 в 22:53
поделиться

Вот короткий список реализаций и языков, которые я попробовал. Это отсортировано по близости с нулем:

  • Схема: (+ 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)
  • язык Common LISP: (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)
  • Perl: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • в ‡’ 1.22464679914735e-16i
  • Python: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • в ‡’ 1.2246467991473532e-16j (CPython)
  • Ruby: require 'complex'; Complex::polar(1, Math::PI) + 1
    • в ‡’ Complex(0.0, 1.22464679914735e-16) (МРТ)
    • в ‡’ Complex(0.0, 1.2246467991473532e-16) (JRuby)
  • R: complex(argument = pi) + 1
    • в ‡’ 0+1.224606353822377e-16i
10
ответ дан 29 November 2019 в 22:53
поделиться

Действительно ли возможно урегулировать этот спор?

Моя первая мысль состоит в том, чтобы смотреть на символьный язык, как Клен . Я не думаю что количества как плавающая точка все же.

На самом деле, как каждый представляет я (или j для инженеров) на стандартном языке программирования?

, Возможно, лучшим примером является sin(ПЂ), = 0? (Или я упустил суть снова?)

7
ответ дан 29 November 2019 в 22:53
поделиться

Я соглашаюсь с Ryan, необходимо было бы переместиться в другую систему представления числа. Решение вне области математических операций с плавающей точкой, потому что Вам нужно пи к представленному как бесконечно длинное десятичное число, таким образом, любая ограниченная схема точности просто не собирается работать (по крайней мере, не используя некоторый фактор выдумки для составления потерянной точности).

5
ответ дан 29 November 2019 в 22:53
поделиться

Ваш вопрос кажется немного нечетным мне, поскольку Вы, кажется, предполагаете, что Математические операции с плавающей точкой реализованы языком. Это обычно не верно, поскольку математика FP сделана с помощью процессора для операций с плавающей точкой в аппаратных средствах. Но программное обеспечение или аппаратные средства, плавающая точка всегда будет неточна. Это, как работают плавания.

при необходимости в лучшей точности, необходимо использовать другое представление числа. Точно так же, как, если Вы делаете целочисленную математику на числах, которые не помещаются в интервал или долго. Некоторые языки имеют библиотеки для этого, встроил (я знаю, что Java имеет BigInteger и BigDecimal), но необходимо было бы явно пользоваться теми библиотеками вместо собственных типов, и производительность была бы (иногда значительно) хуже чем при использовании плаваний.

5
ответ дан 29 November 2019 в 22:53
поделиться

@Ryan Fox

На самом деле, как каждый представляет меня (или j для инженеров) на стандартном языке программирования?

Собственные сложные типы данных совсем не неизвестны. Фортран имел его к середине шестидесятых, и OP показывает множество других языков, которые поддерживают их в тсс продолжении.

И комплексные числа может быть добавлен к другим языкам как библиотеки (с перегрузкой оператора, они даже смотрят точно так же, как собственные типы в коде).

, Но если Вы не обеспечиваете особый случай для этой проблемы, "несоглашение" является просто выражением неточной арифметики машины, нет? Это похоже на жалобу что

float r = 2/3;
float s = 3*r;
float t = s - 2;

концы с (t! = 0) (По крайней мере, если Вы используете достаточно немой компилятор)...

4
ответ дан 29 November 2019 в 22:53
поделиться

На самом деле, как каждый представляет меня (или j для инженеров) на стандартном языке программирования?

На языке, который не имеет собственного представления, оно обычно добавляется с помощью ООП для создания Complex класс для представления i и j с оператором, перегружающимся для надлежащего контакта с операциями, включающими другой Complex числа и или другой собственный компонент примитивов числа языка.

, Например: Complex.java, C++ < комплекс>

3
ответ дан 29 November 2019 в 22:53
поделиться

Числовой Анализ учит нас, что Вы не можете полагаться на точное значение небольших различий между большими количествами.

Это только влияет на рассматриваемое уравнение здесь, но может принести нестабильность ко всему от решения почти исключительной системы одновременных уравнений, посредством нахождения нулей многочленов, к оценке журнала (~1) или exp (~0) (я даже видел специальные функции для оценки журнала (x+1) и (exp (x)-1) для обхода этого).

я поощрил бы Вас не думать с точки зрения обнуления различия - Вы не можете - а скорее в выполнении связанных вычислений таким способом как для обеспечения минимальной ошибки.

я сожалею, это - 43 года, с тех пор как мне вбили это в меня в uni, и даже если я мог бы помнить ссылки, я уверен, что существует лучший материал вокруг теперь. Я предлагаю это как начальная точка.

<час>

, Если это звучит немного покровительственным, я приношу извинения. Мой "Числовой Анализ 101" был частью моего курса Химии, поскольку не было большого количества CS в те дни. У меня действительно нет чувства для места/важности, которое числовой анализ имеет в современном курсе CS.

3
ответ дан 29 November 2019 в 22:53
поделиться

Это ограничение наших текущих вычислительных архитектур с плавающей запятой. Арифметика с плавающей запятой - это только приближение числовых полюсов, таких как 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" из википедия .

Интересный вопрос.

3
ответ дан 29 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: