2016-12-29 4 views
1

я экспериментировал с sin и cos функций в PHP, и я заметил, что этот код:PHP синус, косинус работает странно

echo rad2deg(sin(deg2rad(pi()))); 

вернулся пи. Тем не менее, этот код:

echo asin(sin(pi())); 

который вы думали бы дать где-то вблизи пи (с арксинус синуса) фактически возвращает это:

1.2246467991474E-16 

Я прочитал через PHP руководство по синусов и таких, но я до сих пор не могу понять, почему это работает так и как это работает.

Кто-нибудь знает, как это должно работать?

+1

Подтверждено, что арксин греха pi равен нулю: https://www.google.com/#q=arcsin(sin(pi)). Небольшое значение, которое вы производите, вероятно, связано с ошибкой с плавающей запятой. – nvioli

+0

Вы не должны использовать 'deg2rad' на' pi() '(если вы не хотите конвертировать 3.141 ... градусов в радиан). – chtz

ответ

0

Ваша первая функция будет фактически вычислить

180/pi*sin(pi*pi/180) 

, которая «близко» пи (две цифры), потому что pi*pi/180 является относительно небольшим, а при малых значениях греха (х) составляет приблизительно х.

Для вашей второй части кода следует знать, что pi() не может вернуть точное число pi, но только одну точную двоичную цифру 53. Фактически, если вы вычислите (с более высокой точностью) eps=frac(pi*2^52)/2^52, вы получите около 1.2246467991474E-16., Так sin(pi())=sin(pi-eps)=-sin(-eps)=sin(eps) ~= eps. И, конечно, asin не может догадаться, какое исходное значение было передано sin, поэтому оно всегда будет возвращать значение между -pi/2 и + pi/2.

0

Синус 0 градусов, 180 градусов (pi радианы), 360 градусов (2 * pi радианы) и т. Д. Все 0.

Так что взяв арксин этого результата (0), вы получите 0 назад.

Edit: Это является о математике: от 0 до 360 градусов (0 - 2 * пи радиан), синусовая будет колебаться в диапазоне от -1 до 1. А значения арксинуса любого действительного числа вы можете взять arcsin (между -1 и 1 ...) всегда будет возвращать число между -0.5 * pi и 0.5 * pi. Поэтому он никогда не может быть пи.

См. Простой пример here.

+0

Это не столько математическая сторона, сколько сторона PHP. Я знаю, что синус любого кратного pi равен 0. Я спрашиваю, почему мой PHP не возвращает это. – TricksfortheWeb

+0

@TricksfortheWeb См. Мое редактирование. – jeroen

+0

Если у меня есть число 'x' и взять его синус, какую функцию я должен использовать, чтобы вернуть это число или число, близкое к этому числу? Например, если я дам функции синус из 4, он вернет мне ~ 3.9. – TricksfortheWeb

0

Как sin(x)=x+O(x^3), для малых факторов e и сред размера аргументы x вы получите, что

1/e*sin(e*x) = x + O(e^2*x^3) 

коэффициент pi/180 из градусов в радианы можно рассчитывать как достаточно мал, так что члены высшего порядка не влияют на первые цифр слишком много. Но ни в коем случае это результат вашего первого эксперимента точно pi.

Смежные вопросы