Они не хранят π с необычной точностью с плавающей точкой. Они используют неверное значение для π с двойной точностью. Для приблизительного значения 3.1415926536 в двоичном коде требуется не менее 38 бит:
3.14159265359922… > 11.001001000011111101101010100010001001
Обратите внимание, что 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, поэтому ошибка на входе становится выходом.
cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12
У меня есть калькулятор 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).
Умножение на степень двойки должно влиять только на показатель степени, а не на значение. Может быть возможно определить, как применяется округление путем повторного деления пополам или удвоения.