Asin: примеры (PHP)
asin(float $num): floatФункция asin() в PHP вычисляет арксинус (обратную синусу функцию) числа. Она возвращает угол в радианах, значение синуса которого равно переданному аргументу. Основное использование - в математических расчетах, связанных с геометрией, физикой или обработкой сигналов, когда требуется найти угол по известному значению синуса.
Функция принимает один обязательный аргумент:
- $num (тип
float) - число, для которого вычисляется арксинус. Допустимый диапазон значений: от -1 до 1 включительно. Если значение выходит за этот диапазон, функция вернетNAN(Not a Number).
Возвращаемое значение: угол в радианах в диапазоне от -π/2 до π/2 (от -1.5707963267949 до 1.5707963267949 радиан) или NAN в случае ошибки.
Вычисление арксинуса для значения 0.5:
<?php
$result = asin(0.5);
echo $result;
?>0.5235987755983
Значение в градусах можно получить, умножив результат на (180/π):
<?php
$radians = asin(0.5);
$degrees = $radians * (180 / pi());
echo $degrees;
?>30
Работа с значениями на границах допустимого диапазона:
<?php
echo asin(1); // π/2
echo "\n";
echo asin(-1); // -π/2
?>1.5707963267949 -1.5707963267949
При передаче значения вне диапазона возвращается NAN:
<?php
$result = asin(1.5);
var_dump($result);
?>float(NAN)
В PHP существуют другие тригонометрические функции, обратные основным:
- acos() - вычисляет арккосинус числа. Возвращает угол в радианах, косинус которого равен аргументу. Диапазон возвращаемого значения: от 0 до π.
- atan() - вычисляет арктангенс числа. Возвращает угол в радианах, тангенс которого равен аргументу. Диапазон: от -π/2 до π/2.
- atan2() - вычисляет арктангенс от двух переменных
$y/$x. Учитывает знаки обоих аргументов для определения четверти угла. Диапазон: от -π до π.
Функцию asin() предпочтительно использовать, когда известно значение синуса и нужно найти угол. Если известно значение косинуса или тангенса, применяют acos() или atan() соответственно. Для преобразования координат в угол часто удобнее atan2().
В модуле math есть функция asin(). Поведение аналогично PHP, но в случае выхода аргумента за диапазон вызывается исключение ValueError (в более старых версиях возвращалось NaN).
import math
result = math.asin(0.5)
print(result) # 0.52359877559829880.5235987755982988
В JS есть метод Math.asin(). Возвращает значение в радианах. При недопустимом аргументе возвращает NaN.
let result = Math.asin(0.5);
console.log(result); // 0.52359877559829890.5235987755982989
В MySQL существует функция ASIN(). Возвращает NULL, если аргумент находится вне диапазона [-1, 1].
SELECT ASIN(0.5);0.5235987755982989
Основное отличие PHP-версии - возврат специального значения NAN для недопустимых аргументов, тогда как в других языках могут быть исключения или NULL.
Распространенная ошибка - передача значения, которое по модулю больше 1, без предварительной проверки. Это приводит к получению NAN, что может нарушить дальнейшие вычисления.
<?php
// Ошибочный сценарий
$value = 1.2;
$angle = asin($value);
// Дальнейшие операции с $angle будут некорректны
$result = sin($angle);
echo $result;
?>NAN
PHP попытается преобразовать нечисловые аргументы к числу. Это может привести к неочевидным результатам.
<?php
echo asin('0.5'); // Работает, строка преобразуется в 0.5
echo "\n";
echo asin('abc'); // Преобразует строку к 0, результат 0
?>0.5235987755983 0
Рекомендуется явно проверять тип и диапазон входных данных.
В последних версиях PHP (8.x) существенных изменений в работе функции asin() не было. Однако, начиная с PHP 8.0, некоторые математические функции стали более строгими к типам, но asin() по-прежнему выполняет неявное приведение нечисловых значений к числовому типу. В целом, функция остается стабильной и обратно совместимой.
Вычисление угла при вершине равнобедренного треугольника, если известны боковая сторона и основание.
<?php
$side = 10; // Длина боковой стороны
$base = 12; // Длина основания
// Синус половины угла при вершине: противолежащий катет (половина основания) / гипотенуза (боковая сторона)
$sinHalfAngle = ($base / 2) / $side;
$halfAngle = asin($sinHalfAngle);
$fullAngle = 2 * $halfAngle;
$fullAngleDegrees = $fullAngle * (180 / pi());
echo "Угол при вершине: $fullAngle радиан или $fullAngleDegrees градусов";
?>Угол при вершине: 1.2870022175866 радиан или 73.739795291688 градусов
Безопасное вычисление с проверкой диапазона.
<?php
function safeAsin($value) {
if (!is_numeric($value)) {
throw new InvalidArgumentException("Аргумент должен быть числом");
}
$floatVal = (float) $value;
if ($floatVal < -1 || $floatVal > 1) {
throw new DomainException("Значение должно быть в диапазоне от -1 до 1");
}
return asin($floatVal);
}
// Пример использования
try {
echo safeAsin(0.3);
} catch (Exception $e) {
echo "Ошибка: " . $e->getMessage();
}
?>0.3046926540154
Проверка результата на NAN с помощью is_nan().
<?php
$result = asin(2);
if (is_nan($result)) {
echo "Результат не является числом (NAN)";
}
?>Результат не является числом (NAN)
Сравнение результата asin() с приближенным вычислением через ряд Тейлора (для x = 0.5).
<?php
function asinTaylor($x, $terms = 10) {
$result = 0;
for ($n = 0; $n < $terms; $n++) {
$coeff = (gmp_fact(2 * $n) / (pow(4, $n) * pow(gmp_fact($n), 2) * (2 * $n + 1)));
$result += $coeff * pow($x, 2 * $n + 1);
}
return $result;
}
$x = 0.5;
$exact = asin($x);
$approx = asinTaylor($x, 5);
echo "Точное значение: $exact\n";
echo "Приближенное: $approx\n";
echo "Разница: " . abs($exact - $approx);
?>Точное значение: 0.5235987755983 Приближенное: 0.5235987755983 Разница: 1.1102230246252E-16