Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с Matlab 
:(
    Опции темы
Guinness
Дата 1.7.2013, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  16:20 Найти цитируемый пост)
Но теперь у меня возник вопрос- уместен ли hex2num вместо double, если мы уже провели hex2dec?

Вы прочитали ссылку на вики про double?
Давайте так, как будет выглядить:
num2hex( double( 45 ) ) = ?
num2hex( uint32( 45 ) ) = ?

Цитата(stinker @  1.7.2013,  16:20 Найти цитируемый пост)
нужно ли в промежутке сделать hex2dec, а после провести hex2num?

Не очень понял, где Вы это хотите делать?
PM MAIL   Вверх
stinker
Дата 1.7.2013, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  15:28)
Цитата(stinker @  1.7.2013,  16:20 Найти цитируемый пост)
Но теперь у меня возник вопрос- уместен ли hex2num вместо double, если мы уже провели hex2dec?

Вы прочитали ссылку на вики про double?
Давайте так, как будет выглядить:
num2hex( double( 45 ) ) = ?
num2hex( uint32( 45 ) ) = ?

Цитата(stinker @  1.7.2013,  16:20 Найти цитируемый пост)
нужно ли в промежутке сделать hex2dec, а после провести hex2num?

Не очень понял, где Вы это хотите делать?

Да, я прочёл её уже не первый раз, уже доходил до этой ссылки, в случае с unit выдаёт ошибку, в случае с double '4046800000000000'

хотел это сделать перед итерацией, но увы, также выдёт ошибку.

Добавлено через 6 минут и 14 секунд
Вы указали, что double нужно заменить на hex2num, но поясните пожалуйста, зачем? ведь вычисление до double уже было в hex2dec?

Это сообщение отредактировал(а) stinker - 1.7.2013, 15:37
PM MAIL   Вверх
stinker
Дата 1.7.2013, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



num2hex должен просто перевести число в шестнадцатеричное, т.е например 29 это 1D. матлаб же показывает что 29 это 4a191c2b54d4c50a. 
я просто неправ или оно так и должно  smile

Добавлено @ 16:07
Огроное спасибо за помощь, но теперь я вообще запутался чего матлаб от меня хочет smile 
даже переводя числа, они всеравно в результате остаются с большими степенями изза магического числа. smile
помогите пожалуйста с этим безумным кодом 

Это сообщение отредактировал(а) stinker - 1.7.2013, 16:08
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  17:04 Найти цитируемый пост)
num2hex должен просто перевести число в шестнадцатеричное, т.е например 29 это 1D. матлаб же показывает что 29 это 4a191c2b54d4c50a. я просто неправ или оно так и должно  

Вы немного не так прочитали описание данной функции + пока не понимаете, что такое double. 
1D - это представление 29 как целого числа.

Добавлено @ 16:14
Код

i = num2hex(x); %трактуя 32-битное с плавающей запятой как 32-битное целое
меняем на
i = num2hex( float( x ) );

Ибо double большеват для этого преобразования.

Это сообщение отредактировал(а) Guinness - 1.7.2013, 16:15
PM MAIL   Вверх
stinker
Дата 1.7.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  16:13)
Цитата(stinker @  1.7.2013,  17:04 Найти цитируемый пост)
num2hex должен просто перевести число в шестнадцатеричное, т.е например 29 это 1D. матлаб же показывает что 29 это 4a191c2b54d4c50a. я просто неправ или оно так и должно  

Вы немного не так прочитали описание данной функции + пока не понимаете, что такое double. 
1D - это представление 29 как целого числа.

Но ведь в данном случае мне и нужно сделать его представлением целого, так ведь?

Добавлено через 2 минуты и 19 секунд
Цитата(Guinness @  1.7.2013,  16:13 Найти цитируемый пост)
Добавлено @ 16:14
Без подсветки
1:
2:
3:
i = num2hex(x); %трактуя 32-битное с плавающей запятой как 32-битное целое
меняем на
i = num2hex( float( x ) );

Ибо double большеват для этого преобразования.

тогда при выполнении этого выдаёт 
??? Input argument "ExpBits" is undefined.

Error in ==> float at 54
          DAStudio.error('Shared:numericType:customFloatSupportRemove',
          TotalBits, ExpBits );

Добавлено через 5 минут и 27 секунд
может быть это изза старого матлаба?
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  17:16 Найти цитируемый пост)
Но ведь в данном случае мне и нужно сделать его представлением целого, так ведь?

Да, но double в памяти хранится как число, которое делится на 3 части: знак + экспонента + мантисса.
Тип int хранится как обычное число в двоичном виде: знак + значение.
И Вам в алгоритме от double нужно представление как он хранится в памяти.
В алгоритме на c++ происходят следующие вещи:
1) &x - мы передаем адрес на ячейку памяти, в которой хранится число double(знак + экспонента + мантисса)
2) (uint32 *)&x - говорим, что указатель указывает на ячейку памяти простое целое беззнаковое число(знак + значение)
3) *( (uint32 *)&x ) - значение находящееся по данному адресу как число uint32.
Т.е. мы берем представление числа double как оно хранится в памяти компьютера.
PM MAIL   Вверх
stinker
Дата 1.7.2013, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



судя по хелперу float может задавать только структуру значения, при этом конкретное значение не присвоить.
пример из тогоже хелпера 
Код

>> a = float('single')

a = 

    Class: 'SINGLE'

PM MAIL   Вверх
Guinness
Дата 1.7.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  17:16 Найти цитируемый пост)
тогда при выполнении этого выдаёт ??? Input argument "ExpBits" is undefined.Error in ==> float at 54          DAStudio.error('Shared:numericType:customFloatSupportRemove',          TotalBits, ExpBits );

Странно, сейчас до дома доеду посмотрю.
PM MAIL   Вверх
stinker
Дата 1.7.2013, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вместо double по идее нужен single, т.к по алгоритму идут числа с одинарной точностью?
PM MAIL   Вверх
stinker
Дата 1.7.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



по идее ведь float в маткаде это и есть double?

Добавлено через 12 минут и 39 секунд
хотя нет, при single получается отрицательное число..
PM MAIL   Вверх
stinker
Дата 1.7.2013, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста доделать программу, очень прошу)
пользовался вот этой литературой, но далеко не продвинулся.
помогите пожалуйста)
А то уже за вторую неделю мозг в кашу smile 

Это сообщение отредактировал(а) stinker - 1.7.2013, 18:24
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, похоже нужно single использовать. С чем у Вас ещё проблемы остались?
PM MAIL   Вверх
stinker
Дата 1.7.2013, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на данный момент код выглядит так:
Код

clear, clc
 
x =single(29); %Алгоритм принимает 32-битное число с плавающей запятой 
       %(одинарной точности) в качестве исходных данных
half = 0.5*x; %вычисляет половину значения числа и сохраняет для дальнейшего использования

i = num2hex(x); %трактуя 32-битное с плавающей запятой как 32-битное целое
z=hex2dec(i);
i = hex2dec('5f3759df') - bitshift(z,-1);%производит логический сдвиг вправо на один бит 
                                  %и вычитает число из «магической» константы 5f3759df16
x = single(i); %Переводим результат в 32-битное число с плавающей запятой, получается первое приближение обратного квадратного корня исходного числа
x = x*(1.5 - half*x*x); 

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

Добавлено через 1 минуту и 47 секунд
а по сути от сингла мало что изменилось, результат даже значения не сменил
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



x = single(i);
меняем на
x = single( hex2num( dec2hex( i ) ) );

Это сообщение отредактировал(а) Guinness - 1.7.2013, 19:23
PM MAIL   Вверх
stinker
Дата 1.7.2013, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  19:22)
x = single(i);
меняем на
x = single( hex2num( dec2hex( i ) ) );

в результате выходит значение "-Inf", минус бесконечность собсна

Добавлено @ 19:33
ой, извините, не в ту программу код поставил)
теперь понял что нужно было обращать i обратно в hex, потом в num, прям прояснило)

Добавлено @ 19:34
огромное спасибо что помогли!
так, если в результате у нас должен быть обратный квадратный корень, к примеру 29, то 1/sqrt(29)=0.185695338177052
а у нас по результатам кода выходит 1.3516559e-08
это нормально? или расчёты ошибочны?

Это сообщение отредактировал(а) stinker - 1.7.2013, 19:35
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Математические пакеты | Следующая тема »


 




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


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

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