Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логарифмический график 
V
    Опции темы
RastaDja
Дата 31.1.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Привет all!

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

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

double a[100];

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

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

Спассибо.




--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 31.1.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Мммм. 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;
    }
}



--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
borisbn
Дата 31.1.2011, 23:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



спорим, что решение неправильное ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RastaDja
Дата 1.2.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



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


ммм. Почему?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
borisbn
Дата 1.2.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(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;


Это сообщение отредактировал(а) borisbn - 1.2.2011, 09:49


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RastaDja
Дата 1.2.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(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;
    }
}



--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
borisbn
Дата 1.2.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(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;
    }
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RastaDja
Дата 1.2.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



ладно, спс  smile 
Цитата

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

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


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 1.2.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



ладно спс, я уже понял  smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Фантом
Дата 1.2.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



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

    else a[i]=0.0;

вставлять, а сообщение об ошибке выкидывать (или исключение и т.п.). Как вариант - присваивать такому a[i] максимальное по модулю отрицательное значение, возможное для данного типа.
PM   Вверх
borisbn
Дата 1.2.2011, 16:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Фантом, т.к. использую ipp, то делаю так
Код

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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RastaDja
Дата 1.2.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



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

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


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Фантом
Дата 1.2.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



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

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

Тогда надо выкидывать ошибку или просто не отрисовывать эту точку. Ведь значение логарифма, равное 0 - это не что-то нестандартное, а у Вас получается, что одно и то же число используется и как обычное значение, и как признак ошибки.
PM   Вверх
RastaDja
Дата 2.2.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



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


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

Спс за помощь 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.