Как заставить значения с плавающей запятой больше чем 1e-8 к 0 - PullRequest
4 голосов
/ 15 мая 2019

В настоящее время я работаю над внедрением прямого сокращения Matrix, и теперь оно проходит почти все мои тесты. Однако у меня проблема с округлением значений с плавающей точкой. Я уменьшаю ненулевые строки ниже элемента pivot, просто добавляя -1 * a [j, col] / a [i, col], где i = pivot, и j инициализируется в i + 1, итерируя вниз, пока все строки не будут сделано.

Однако скажите, что я хочу допуск 1e-10 для сравнений с плавающей запятой. Как я могу принудительно установить значения в [j, col] в ноль, если они превышают этот допуск?

В некоторых случаях у меня есть значения от 1e-14 до 1e-15, в моих тестовых случаях, которые должны быть равны нулю. Текущие случаи, которые я попробовал, показаны ниже, но это не сработало. Может кто-то указать мне верное направление? «

Это первый раз, когда я пытаюсь сравнить значения с плавающей запятой, которые я прочитал, может быть трудно, поэтому я надеюсь, что кто-то может помочь мне решить эту проблему, поскольку в настоящее время мое приложение останавливается до тех пор, пока оно не будет исправлено.

var tolerance = 1e-10;
if (a[j, lead] < a[j, lead]*tolerance) { 
    a[j, lead] = 0; 
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Не уверен, что я полностью понимаю ваши условия, но если вы просто заботитесь об экспоненте, вы можете проверить, что это за экспоненты, и исходя из этой проверки, соответствует ли она вашим критериям.

Ваш заголовок говорит "Как сделать?"Я задаю значения с плавающей запятой, превышающие 1e-8, равными 0 ":

var tolerance = 1e-8;
bool compareExponents = 
(int) Math.Floor(Math.Log10(Math.Abs(a[j, lead]))) > 
(int) Math.Floor(Math.Log10(Math.Abs(tolerance))) ? true : false;

a[j,lead] = compareExponents ? 0 : a[j,lead];
//if the value(i.e a[j,lead]) is larger than the tolerance, i'm setting the value to 0. 
//otherwise, just keep the current value.
//
//1e^-15 > tolerance ==> 0
//1e^-8 > tolerance ==> a[j,lead]

Если вы заботитесь только о показателе, не превышающем определенного значения, вы можете попробовать это.

0 голосов
/ 15 мая 2019

Вы можете попробовать этот подход

var tolerance = 1e-10;
var fraction = a[j, lead] - Math.Truncate(a[j, lead];
if (fraction<tolerance)
{
    a[j, lead] = 0;
}
...