Небольшое отклонение в точности с плавающей точкой (im), часть 1

Большинство математиков согласны с тем, что:

e πi + 1 = 0

Однако большинство реализаций с плавающей точкой не согласны. Насколько хорошо мы можем уладить этот спор?

Мне бы хотелось услышать о разных языках и реализациях, а также о различных методах, позволяющих сделать результат максимально близким к нулю. Будь креативным!

4.08.2008 06:21:38
Только большинство математиков?
biozinc 26.12.2008 20:26:28
@Foo Бах: я откатил ваше редактирование обратно, потому что дело в том, что это выражение содержит 0, 1, i, e и π. Если переписать это как exp, то оно теряет свою «поэзию».
Chris Jester-Young 23.09.2011 00:41:40
@FooBah: не правда. Математики (особенно обученные в хитросплетениях с плавающей запятой) не согласны с этим exp(pi * i) + 1 = 0. Только чистая математическая форма принимается за истину. Вопрос заключается в том, насколько «утечка» в терминах с плавающей запятой.
Chris Jester-Young 23.09.2011 00:45:58
@ ChrisJester-Young Пожалуйста, объясните, как кто-то может принять e ** (πi) + 1 = 0, но не может принять exp (πi) + 1 = 0 на математическом уровне. Если вы изучаете проблему с плавающей запятой, то не имеет значения, какое выражение вы используете - оба одинаковы.
Foo Bah 23.09.2011 00:49:15
@FooBah: потому что вы оправдываете использование expего с плавающей запятой, что приводит expформу в область с плавающей запятой. Очевидно, в терминах с плавающей точкой exp(pi * i) + 1 != 0. Таким образом, ваши изменения в использовании exp, исходя из вашей логики перехода expв первую очередь, фальсифицируют первое предложение поста.
Chris Jester-Young 23.09.2011 00:59:33
10 ОТВЕТОВ
РЕШЕНИЕ

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

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

17
26.12.2008 20:22:01
Да, я полностью согласен с «идущим символическим» маршрутом, что если вы делаете серьезный триггер, то числа должны поддерживаться с коэффициентами 1, i и π (и e, в некоторых случаях). Мне не хватает математика, чтобы сказать, нужно ли освещать больше дел. :-)
Chris Jester-Young 27.12.2008 02:18:37
Ваша точка зрения развивает мою точку зрения (см. Мой комментарий от 25 августа) лучше, чем другие ответы, поэтому я приму ваш ответ как «лучший».
Chris Jester-Young 27.12.2008 02:22:28

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

  • Схема: (+ 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, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i(СКМ)
  • 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)
  • Рубин: 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
10
25.08.2008 00:36:45

Возможно ли уладить этот спор?

Моя первая мысль - взглянуть на символический язык, такой как Maple . Я не думаю, что это считается плавающей точкой, хотя.

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

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

7
5.01.2010 14:00:22
Фактически, это очень похоже на вопрос о том, является ли sin π = 0. Опять же, ни одна из реализаций FP, которые я здесь показываю, не показывает, что она равна 0, поэтому я полагаю, что «спор» не может быть полностью разрешен на 100%. Но так как мы говорим о FP, приблизительные решения должны будут сделать. :-P Многие языки программирования имеют класс комплексных чисел, который просто содержит два doubles. Для меня это достаточно хорошо, если в языке также есть средства для выполнения (своего рода) перегруженных операций над ними (например, использование cmathв Python нормально, хотя и не является строго перегрузкой). Я не использовал Maple, так что я не могу комментировать
Chris Jester-Young 4.08.2008 06:36:06

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

5
25.08.2008 01:10:29
Бинго! Мой вопрос на самом деле состоит в том, чтобы увидеть, какие реализации используют какой-то фактор выдумки, чтобы сделать ответ ближе к 0, чем другие. Например, один из способов сделать это - получить специальную величину π, как во многих языках есть специальная величина i для комплексных чисел; числа затем сохраняются в единицах, кратных 1, i и π, в зависимости от ситуации. Конечно, это, вероятно, не должно быть встроено в центральный язык, но библиотечный модуль, чтобы сделать это прозрачно, было бы неплохо. И это сделает ряд тригонометрических операций более точным (если специальные версии предоставлены указанной библиотекой
Chris Jester-Young 25.08.2008 22:53:29

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

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

5
25.08.2008 13:37:28

@ Райан Фокс

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

Нативные сложные типы данных далеко не известны. У Фортрана это было к середине шестидесятых, и ОП демонстрирует множество других языков, которые поддерживают их в истории.

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

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

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

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

4
25.08.2008 13:40:18

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

Иррациональные числа являются отношениями, как функции, в некотором смысле, каким образом? Хорошо, подумайте: «Если вы хотите идеальный круг, дайте мне идеальный пи», но круги отличаются от других фигур (4 стороны, 5, 6 ... 100, 200), но ... Сколько еще сторон делают у вас, больше похоже на круг это выглядит. Если вы до сих пор следовали за мной, то соедините все эти идеи с помощью формулы Пи: введите описание изображения здесь

Итак, пи - это функция, но она никогда не заканчивается! из-за параметра ∞, но мне нравится думать, что у вас может быть «экземпляр» числа pi, если вы измените параметр ∞ для очень большого значения Int, у вас будет очень большой экземпляр числа pi.

То же самое с е, дай мне огромный параметр, я дам тебе огромный е.

Собираем все идеи вместе:

Поскольку у нас есть ограничения памяти, язык и библиотеки предоставляют нам огромное количество иррациональных чисел, в данном случае, pi и e, в качестве конечного результата у вас будет долгий подход к получению 0, как в примерах, предоставленных @Chris Jester-Young

4
6.05.2017 03:07:58

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

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

Например: Complex.java , C ++ <complex>

3
25.08.2008 13:48:46

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

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

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

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


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

3
27.12.2008 12:10:04
Да, эти функции называются expm1 и log1p, и я полностью согласен с их использованием, когда величины достаточно малы, чтобы иметь значение. Мой вопрос был скорее вопросом шутки, но он приводит к некоторым серьезным темам; спасибо за расширение на них.
Chris Jester-Young 27.12.2008 02:16:49

Это ограничение нашей текущей вычислительной архитектуры с плавающей запятой. Арифметика с плавающей запятой - это только приближение числовых полюсов, таких как e или pi (или что-то сверх точности, которую позволяют ваши биты). Мне действительно нравятся эти числа, потому что они не поддаются классификации и, похоже, имеют большую энтропию (?), Чем даже простые числа, которые являются каноническими рядами. Соотношение не поддается численному представлению, иногда такие простые вещи могут поразить человека (мне это нравится).

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

Рассмотрим библиотеку / язык, который описывает такие понятия, как e и pi в форме, понятной машине. Есть ли у машины представление о том, что такое идеальный круг? Вероятно, нет, но мы можем создать объект - круг, который удовлетворяет всем известным признакам, которые мы ему приписываем (постоянный радиус, отношение радиуса к окружности равно 2 * pi * r = C). Объект, подобный пи, описывается только вышеупомянутым отношением. R & C могут быть числовыми объектами, описанными с любой точностью, которую вы хотите им дать. e можно определить как «e - это уникальное действительное число, такое, что значение производной (наклон касательной линии) функции f (x) = ex в точке x = 0 равно 1» из википедии .

Веселый вопрос.

3
23.05.2017 12:10:30