UserEfi в MathCad. Значение NaN, Inf и т.п.

Форум пользователей пакета Mathcad

Модератор: Admin

Alex_cs_gsp
Сообщения: 30
Зарегистрирован: Чт май 11, 2006 9:22 pm
Откуда: Днепропетровск (УКРАИНА)

UserEfi в MathCad. Значение NaN, Inf и т.п.

Сообщение Alex_cs_gsp » Пн мар 22, 2010 9:05 pm

Решил реализовать один статистический критерий, который проверяет на однородность выборки различного размера. Решил писать все на С++, а затем использовать UserEfi для подключения Dll. Обнаружил следующую проблему. Т.к. критерий работает с выборками разного размера, то мне нужно в ф-ю объявленную в Dll передавать матрицу, в которой у выборок меньшего размера отсутствующие позиции представлены значением NaN. Но оказывается числа c плавающей запятой, которые маткад отображает как NaN, в действительности представлены значением Ind (Indeterminate – “неопределённость”), а не Quiet NaN как требуется, и при их обработки маткад генерирует исключение. Ну думаю нельзя NaN, значит можно взять Inf. Но тут обнаруживается, что Inf в маткаде - это 10^307, а не то, что требует IEEE 754. Просто интересно, почему так сделано?[/list]

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Пн мар 22, 2010 9:56 pm

В MC11 можно передавать вложенный массив произвольного размера (динамический). В последующих версиях на это дело ввели ограничения - запретили.
Не понятно, почему нужны NaN? Размер массива передаётся вместе с ним.

Alex_cs_gsp
Сообщения: 30
Зарегистрирован: Чт май 11, 2006 9:22 pm
Откуда: Днепропетровск (УКРАИНА)

Сообщение Alex_cs_gsp » Пн мар 22, 2010 11:16 pm

Каждая строка передаваемого массива - выборка произвольного размера. Соответственно, если без изобретения колес и велосипедов, количество столбцов в передаваемом в ф-ю массиве == размеру наибольшей выборки. Тогда элементам в матрице, которые соответствуют меньшим по размеру выборкам нужно присвоить недействительные значения.
Можно, конечно, передавать в ф-ю не все выборки, а написать две ф-ии - одну add(), для добавления выборки, и вторую непосредственно для расчетов. Но тогда усложняется код в Dll, т.к нужен будет глобальный вектор и локальная память потока.
Тут просто вопрос, почему разработчики стандарт не захотели соблюсти.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Вт мар 23, 2010 7:19 am

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

Alex_cs_gsp
Сообщения: 30
Зарегистрирован: Чт май 11, 2006 9:22 pm
Откуда: Днепропетровск (УКРАИНА)

Сообщение Alex_cs_gsp » Вт мар 23, 2010 8:09 am

uni писал(а):Сделайте первый элемент каждой строки длинной выборки, а остальное заполняйте нулями.

Спасибо! Идея хорошая, так и поступлю, только отдельно буду передавать матрицу и вектор с размерами.

VFO
Сообщения: 4227
Зарегистрирован: Ср фев 27, 2002 8:03 pm

Сообщение VFO » Вт мар 23, 2010 10:59 am

Может кому-то будет интересен мой опыт статистической обработки векторов и матриц, включая разреженные:
http://twt.mpei.ac.ru/ochkov/TablSite