Как интерпретировать ситуации, когда Math.Acos () сообщает о неверном вводе? - PullRequest
1 голос
/ 19 апреля 2010

Привет всем. Я вычисляю угол между двумя векторами, и иногда Math.Acos () возвращает NaN, когда его вход выходит за границы (-1> input && input> 1) для косинуса. Что именно это значит? Кто-нибудь сможет объяснить, что происходит? Любая помощь приветствуется!

Вот мой метод:

 public double AngleBetween(vector b)
    {
        var dotProd = this.Dot(b);
        var lenProd = this.Len*b.Len;
        var divOperation = dotProd/lenProd;

        //  http://msdn.microsoft.com/en-us/library/system.math.acos.aspx
        return Math.Acos(divOperation) * (180.0 / Math.PI);
    }

Вот моя реализация Dot и Len:

public double Dot(vector b)
    {
        // x's and y's are lattitudes and longitudes (respectively)
        return ( this.From.x*b.From.x + this.From.y*b.From.y);
    }

    public double Len{
        get
        {
             // geo is of type SqlGeography (MS SQL 2008 Spatial Type) with an SRID of 4326
             return geo.STLength().Value;
        }
    }

Ответы [ 3 ]

2 голосов
/ 19 апреля 2010

У вас есть векторы, для которых divOperation оказывается <-1 или> 1? Тогда я думаю, что вы должны проверить свои реализации Dot и Len.

1 голос
/ 19 апреля 2010

Поскольку Cos угла всегда находится между -1 и +1, невозможно вычислить обратную функцию (Acos) значения вне этого диапазона ИЛИ это означает, что вы передали NaN функции ACos.

Я подозреваю, что в этом случае это последнее - одна из ваших длин, вероятно, равна нулю.

0 голосов
/ 19 апреля 2010

NaN означает "не число" . Математически вы не можете взять арккозин числа, которое находится за пределами диапазона [-1, 1] (или, может быть, вы можете, но результат сложный - я не помню), поэтому результат попытки сделать это никакого числа вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...