Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Логарифмический график


Автор: RastaDja 31.1.2011, 15:14
Привет all!

Может задаю нубский вопрос, но всё же.

Есть массив
Код

double a[100];

в массиве значения.

Как мне заменить значения массива a, соответственными значениями в логарифмическом масштабе (log10)?

Спассибо.


Автор: RastaDja 31.1.2011, 16:15
Мммм. smile 
Долго, долго товарищи. smile 
Так как предложений не пришло, успел сам сделать.
Вот! Пользуйтесь, кому надо.
Код

int arrlen = 100;
double a = new double[arrlen];
//заполняем как то a
for(int i = 0; i < arrlen; ++i) {
    if(a[i] > 1) a[i] = log(a[i]);
    else a[i]=0;
    }
}

Автор: borisbn 31.1.2011, 23:16
спорим, что решение неправильное ?

Автор: RastaDja 1.2.2011, 09:30
Цитата(borisbn @  31.1.2011,  23:16 Найти цитируемый пост)
спорим, что решение неправильное ? 


ммм. Почему?

Автор: borisbn 1.2.2011, 09:47
Цитата(RastaDja @  31.1.2011,  15:14 Найти цитируемый пост)
в логарифмическом масштабе (log10)?

Цитата(RastaDja @  31.1.2011,  16:15 Найти цитируемый пост)
 if(a[i] > 1) a[i] = log(a[i]);


log( x ) - логарифм по основанию e
log10( x ) - по основанию 10

и ещё - логарифм числа меньше 1 это нормальные значения, а вот от нуля брать нельзя.
Правда сравнивать числа типа double с нулём тоже не желательно, поэтому нужно задаться каким-то эпсилон и сравнивать с ним.

Код

const double epsilon = 1e-19;
...
if ( a[ i ] > epsilon ) ...
else a[ i ] = 0;

Автор: RastaDja 1.2.2011, 10:20
Цитата(borisbn @  1.2.2011,  09:47 Найти цитируемый пост)
и ещё - логарифм числа меньше 1 это нормальные значения, а вот от нуля брать нельзя.
Правда сравнивать числа типа double с нулём тоже не желательно, поэтому нужно задаться каким-то эпсилон и сравнивать с ним.


тоесть так вот?:
Код

int arrlen = 100;
double a = new double[arrlen];
//заполняем как то a
for(int i = 0; i < arrlen; ++i) {
    if(a[i] > 0.0) a[i] = log10(a[i]);
    else a[i]=0.0;
    }
}

Автор: borisbn 1.2.2011, 10:26
Цитата(RastaDja @  1.2.2011,  10:20 Найти цитируемый пост)
тоесть так вот?:

почти. лучше всё-таки так
Код

int arrlen = 100;
double a = new double[arrlen];
const double epsilon = 1e-19;
//заполняем как то a
for(int i = 0; i < arrlen; ++i) {
    if(a[i] > epsilon) a[i] = log10(a[i]);
    else a[i]=0.0;
    }
}


Автор: RastaDja 1.2.2011, 10:39
ладно, спс  smile 
Цитата

const double epsilon = 1e-19; //vs epsilon = 0.0

а в чем разница? можеш разъяснить?

Автор: RastaDja 1.2.2011, 12:06
ладно спс, я уже понял  smile 

Автор: Фантом 1.2.2011, 15:07
Еще одна добавка - если в "логарифмируемом" массиве обнаружится нулевое значение, то, вообще говоря, надо не заглушку
Код

    else a[i]=0.0;

вставлять, а сообщение об ошибке выкидывать (или исключение и т.п.). Как вариант - присваивать такому a[i] максимальное по модулю отрицательное значение, возможное для данного типа.

Автор: borisbn 1.2.2011, 16:04
Фантом, т.к. использую ipp, то делаю так
Код

ippsThreshold_LT_64f_I( &arr[ 0 ], arr.size(), 1e-19 );
ippsLog10_64f_A50( &arr[ 0 ], &arr[ 0 ], arr.size() );

получается быстрее, чем в цикле проверять > epsilon
smile

Автор: RastaDja 1.2.2011, 17:41
Цитата(Фантом @  1.2.2011,  15:07 Найти цитируемый пост)
вставлять, а сообщение об ошибке выкидывать (или исключение и т.п.). Как вариант - присваивать такому a[i] максимальное по модулю отрицательное значение, возможное для данного типа. 

но я рисую график по этому массиву, а 0.0 это значение Y.

Автор: Фантом 1.2.2011, 17:45
Цитата(RastaDja @  1.2.2011,  17:41 Найти цитируемый пост)

но я рисую график по этому массиву, а 0.0 это значение Y. 

Тогда надо выкидывать ошибку или просто не отрисовывать эту точку. Ведь значение логарифма, равное 0 - это не что-то нестандартное, а у Вас получается, что одно и то же число используется и как обычное значение, и как признак ошибки.

Автор: RastaDja 2.2.2011, 16:43
Цитата(Фантом @  1.2.2011,  17:45 Найти цитируемый пост)
Тогда надо выкидывать ошибку или просто не отрисовывать эту точку. Ведь значение логарифма, равное 0 - это не что-то нестандартное, а у Вас получается, что одно и то же число используется и как обычное значение, и как признак ошибки. 


во первых: мне не нужны никакие признаки ошибки  smile ;
во вторых: я этот массив формирую на лету, тоесть, я рисую график просто, а если у меня флаг установлен в FlgLogarifm = true, на лету создаю массив логарифм. масштаба и рисую его

Спс за помощь 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)