Как вы, возможно, знаете, Spotlight может выполнять простую математику. Например, ввод cos(pi)
приведет -1
, как вы могли ожидать. Я просто набрал cos(pi/2)
, который должен быть 0, но это дало мне -5e-12
.
Да, это, вероятно, из-за ошибки округления, но давай cos(pi/2)
:! На мой взгляд, это явно похоже на ошибку. Что вы думаете?
pi
само по себе будет жестко закодировано (как вы получите -1 дляcos(pi)
), но как только вы манипулируете им, вы получите число с плавающей запятой, которое имеет ограниченную точность. OSX не жестко программируетpi/2
иpi/4
т. Д., Фактически выполняет операцию.0.1
точно представить . точно, но это бесполезно для иррациональных чисел, таких как пи, которые не могут быть представлены точно ни в двоичном, ни в десятичном виде.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Ответы:
Это связано с отсутствием точности пи и из-за общего отсутствия точности во встроенной системе.
Об общей точности системы:
В Python мы получаем следующее:
Как мы видим, есть проблема с точностью, поскольку она даже не соответствует представлению с плавающей точкой.
источник
Они не хранят π с необычной точностью с плавающей точкой. Они используют неверное значение для π с двойной точностью. Для приблизительного значения 3.1415926536 в двоичном коде требуется не менее 38 бит:
Обратите внимание, что 2 ^ -36 составляет примерно 1,5e-11, что совпадает с конечным 99. Плавающая точка двойной точности имеет 52-битное значение. Чтобы оценить
cos(pi/2)
как -5e-12, единственным другим возможным выбором был бы 48-битный тип, что было бы очень странно.Вблизи 0 и π, где производная близка к нулю, cos (θ) не может быть рассчитан очень точно:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Это отличается от -1 примерно на 5,2e-23, что меньше, чем ε для
double
, поэтомуcos(3.1415926536)
рассчитывается как точно -1 ..., что неверно.Вблизи ± π / 2 производная [ -sin (θ) ] составляет почти ± 1, поэтому ошибка на входе становится выходом.
У меня есть калькулятор TI, который отображает на одну цифру меньше и рассчитывается
cos(π/2)
как -5.2e-12. Тем не менее, он сильно отличается в электронном виде и был разработан, чтобы дать точное значение дляcos(90°)
.Я бы предположил, что в Spotlight
cos(pi/2)
вычисляется путем извлечения значения для π, преобразования в десятичную строку , сохранения его в качестве (точного, рационального) двоичного значения 11.00100100001111110110101010001000100100001101101111 (или 10000), деления на 2 и последующего вычитания этого значения из истинное значение П / 2. Вы должны выяснить,cos(pi/2 + cos(pi/2))
ближе ли это к нулю (это может быть -2.2e-35).Умножение на степень двойки должно влиять только на показатель степени, а не на значение. Может быть возможно определить, как применяется округление путем повторного деления пополам или удвоения.
источник
Это ошибка, которая воспроизводима в 10.9.2 - и ошибка округления с плавающей запятой, подобная этой, довольно типична.
Это значение пи, которое обрабатывается без достаточной точности, если я должен был угадать.
Я бы отправился на https://developer.apple.com/bug-reporting/, если вы хотите увидеть устройство исправления ошибок Apple в действии.
источник
cos(2*acos(0)*0.5)
возвращает номер заказа10^-10
. Так что это не потому, что константа π недостаточно точна. Я не могу объяснить этот результат: он слишком неточен для двойной точности и слишком точен для одинарной точности.Из других ответов и комментариев становится ясно следующее:
Тот факт, что вы получаете ненулевой результат, НЕ является ошибкой, даже при идеальной реализации программного обеспечения вы столкнетесь с пределами вычислений с плавающей запятой. Однако ошибка порядка 10 ^ -12 действительно велика.
Это НЕ вина в неточности чисел с плавающей запятой. Результат, который вы получите, это:
Это можно проверить с помощью любого альтернативного программного пакета. Если вы оцените
cos(pi/2)
один из этих пакетов, вы определенно получите результат, намного более близкий к нулю, чем 10 ^ -12.В заключение я вижу два возможных ограничения, одно из которых должно применяться:
Возможно, кто-то, имеющий доступ к программному обеспечению, может проверить, какое из этих применений применимо.
Обновление Как уже упоминалось в комментарии, проблема заключается в точности константы
pi
.источник
Учитывая , что
-5e-12
является verryyyy небольшого числа, это является ошибкой округления.Я думаю, что это следствие того, что прожектор показывает больше десятичных знаков, чем используется в определении
pi
константы или бесконечного ряда, используемого для вычисления тригонометрических функций.источник