Fairek
@Fairek
Пргораммист, техник, универсал

Как обрезать число двойной точности?

Есть следующая задача: итеративно проаппроксимировать некую дискретно заданную функцию, используя функции Гаусса и Лоренца. Если с гауссом проблем нет, то с Лоренцом возник интересный казус. Суть алгоритма сводится к изменению одного параметра в функции Лоренца, а после сравнению полученного значения с заданной точностью, и, если точность подходит, то обрабатывается следующее число, иначе опять меняется параметр.
Суть проблемы: после определенного количества итераций происходит сравнение
if (a < - eps) then ...
где a = - 0.0010000456..., eps = 0.001.
Процессор справедливо считает, что условие верно, и a < eps, но, с математической точки зрения на задачу, хвост ...456... абсолютно незначителен. При последующих итерациях алгоритма этот хвост только становится меньше, но остается в тех же пределах.
Вопрос: как его отрезать?
Я пробовал менять значение точности, пробовал округлять до следующего знака - все это не работает, так как в таком случае алгоритм просто подгоняет хвост под мое округление. Есть вариант сделать поразрядное сравнение, но я довольно плохо представляю, как корректно разбить число типа Double на массив из Int без танцев с бубном.
  • Вопрос задан
  • 594 просмотра
Пригласить эксперта
Ответы на вопрос 1
arxont
@arxont
C# программист
https://msdn.microsoft.com/ru-ru/library/75ks3aby(...

double x1 = 0.0010000456;
double x2 = 0.001;

Console.WriteLine(x1 == x2);

//Способ 1. Округляем числа до 4 знаков и сравниваем
Console.WriteLine(Math.Round(x1, 4) == Math.Round(x2, 4));

//Способ 2. Через разность
Console.WriteLine(Math.Abs(x1 - x2) < 0.0001);

//Способ 3. Через string и convert. !!! ШУТКА !!! В РЕАЛЬНОМ КОДЕ НЕ ИСПОЛЬЗОВАТЬ
string strx1 = x1.ToString().Substring(0, 5);
string strx2 = x2.ToString().Substring(0, 5);
Console.WriteLine(strx1 == strx2);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы