Функция получения абсолютного значения не работает с десятичными числами - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь создать метод, который возвращает норму Фробениуса.

    public static decimal FNorm2(decimal[,] mat)
    {
        decimal ats = 0;

        for (int i = 0; i < mat.GetLength(0); i++)
        {
            for (int j = 0; j < mat.GetLength(1); j++)
            {
                ats += Math.Pow(Math.Abs(mat[i, j]), 2);
            }
        }
        Math.Pow(ats, 0.5);
        return ats;
    }

Это мой код.

И я получаю:

Ошибка CS1503 Аргумент 1: невозможно преобразовать из «десятичного» в «двойной» в строке

    ats += Math.Pow(Math.Abs(mat[i, j]), 2);

он подсвечивает функцию Math.Abs.

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вам не нужно абсолютное значение, когда вы заключаете число в квадрат;квадраты всегда положительны.

Math.Pow неэффективно для возведения в квадрат значений. Что не так с x*x?

Я бы использовал функцию квадратного корня.

public static double FNorm2(double[,] mat)
{
    double ats = 0.0;

    for (int i = 0; i < mat.GetLength(0); i++)
    {
        for (int j = 0; j < mat.GetLength(1); j++)
        {
            ats += mat[i, j]*mat[i, j];
        }
    }
    return Math.Sqrt(ats);
}
1 голос
/ 20 октября 2019

Math.Pow принимает двойные параметры и, кроме того, вам нужно сохранить его результат. Вы можете либо объявить ats как двойное число, либо использовать библиотеку, обрабатывающую Pow с десятичными знаками (например, эта ).

double ats = 0;
...
double result = Math.Pow(ats, 0.5);
return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...