Поиск:

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


Новичок



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

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



По заданию нужно составить код по нахождению быстрого обратного квадратного корня. Код не ахти как сделал, но результат выходит подозрительно не тот(отрицательное число). Помогите пожалуйста доработать, чтобы работала правильно 
x = 29; 
half = 0.5*x; 
i = uint32(x); 
i = hex2dec('5f3759df') - bitshift(i,-1); 
x = double(i); 
x = x*(1.5 - half*x*x);
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как Вы думаете, что делают операторы uint32 и double? Если знаете, то именно это Вы хотели получить?
PM MAIL   Вверх
stinker
Дата 1.7.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @  1.7.2013,  11:57 Найти цитируемый пост)
Как Вы думаете, что делают операторы uint32 и double? Если знаете, то именно это Вы хотели получить? 

unit32- переводим число в целое, согласно алгоритму нужно 32-битное
double- переводим обратно в число с плавающей запятой, также согласно алгоритму.

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


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  15:24 Найти цитируемый пост)
unit32- переводим число в целое, согласно алгоритму нужно 32-битное
double- переводим обратно в число с плавающей запятой, также согласно алгоритму.

В общем-то, в гугле вторая ссылка(пример на яве) все бы Вам разъяснила. На самом деле Вам нужно представление числа double как 32-битное целое. А этими операциями Вы преобразуете число double к uint32 и соответственно обратно.
Код

double a = 3.14;
int b = int(a); // b = 3

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


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  14:31)
Цитата(stinker @  1.7.2013,  15:24 Найти цитируемый пост)
unit32- переводим число в целое, согласно алгоритму нужно 32-битное
double- переводим обратно в число с плавающей запятой, также согласно алгоритму.

В общем-то, в гугле вторая ссылка(пример на яве) все бы Вам разъяснила. На самом деле Вам нужно представление числа double как 32-битное целое. А этими операциями Вы преобразуете число double к uint32 и соответственно обратно.
Код

double a = 3.14;
int b = int(a); // b = 3

Эти ссылки я смотрел, и ещё пару десятков. Не очень силён в языках поэтому и обращаюсь за помощью. Тоесть Вы хотите сказать что double в конце не нужен?

Добавлено через 1 минуту и 38 секунд
сейчас код выглядит вот так

Код

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

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



Добавлено через 3 минуты и 58 секунд
Следуя алгоритму представление числа как 32-битное целое нужно на этапе вычитания из магического числа, при вычислении метода Ньютона нужно снова число с плавающей запятой. Если не прав поправте пожалуйста.
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  15:50 Найти цитируемый пост)
Следуя алгоритму представление числа как 32-битное целое нужно на этапе вычитания из магического числа, при вычислении метода Ньютона нужно снова число с плавающей запятой. Если не прав поправте пожалуйста.

Все так. Просто число double - это знаковый бит + эскспонента + мантисса. И Вам нужно именно это представление, а не перевод из double в uint как я показывал постом выше. Понятно?
PM MAIL   Вверх
stinker
Дата 1.7.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  14:59)
Цитата(stinker @  1.7.2013,  15:50 Найти цитируемый пост)
Следуя алгоритму представление числа как 32-битное целое нужно на этапе вычитания из магического числа, при вычислении метода Ньютона нужно снова число с плавающей запятой. Если не прав поправте пожалуйста.

Все так. Просто число double - это знаковый бит + эскспонента + мантисса. И Вам нужно именно это представление, а не перевод из double в uint как я показывал постом выше. Понятно?

Тоесть если я Вас правильно понял из double в unit перевод не нужен? тогда каким же образом можно представить число как целое? просто убрав unit изменений в конечном результате нет. Большое спасибо, что помогаете.
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем, не буду Вас мучить. Вот ссылки на две функции, которые Вам нужны:
вместо uint32()
вместо double
Если не ошибаюсь, они Вам помогут. Проверьте на каких либо простых значениях, типа 25, 36 и т.п. Матлаба под рукой нет, так что у себя проверить не могу. Если нужно могу на C++ выложить.
PM MAIL   Вверх
stinker
Дата 1.7.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Опытный
**


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

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



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


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  15:04)
В общем, не буду Вас мучить. Вот ссылки на две функции, которые Вам нужны:
вместо uint32()
вместо double
Если не ошибаюсь, они Вам помогут. Проверьте на каких либо простых значениях, типа 25, 36 и т.п. Матлаба под рукой нет, так что у себя проверить не могу. Если нужно могу на C++ выложить.

Большое спасибо! Но при замене, теперь выходит ошибка логического сдвига "Undefined function or method 'bitshift' for input
arguments of type 'char'."

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


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  16:09 Найти цитируемый пост)
"Undefined function or method 'bitshift' for inputarguments of type 'char'."

Интерпритатор говорит Вам, что не может применить данную операцию к строке. Соответственно, перевидете строку в целое число как Вы делали выше с помощью hex2dec.
PM MAIL   Вверх
stinker
Дата 1.7.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  15:09)
float, это не работает?

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


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  16:14 Найти цитируемый пост)
также выдаёт ошибку

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


Новичок



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

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



большое спасибо за обьяснение, это сработало. Но теперь у меня возник вопрос- уместен ли hex2num вместо double, если мы уже провели hex2dec? 
нужно ли в промежутке сделать hex2dec, а после провести hex2num?

Добавлено через 2 минуты и 57 секунд
Цитата(Guinness @ 1.7.2013,  15:19)
Цитата(stinker @  1.7.2013,  16:14 Найти цитируемый пост)
также выдаёт ошибку

=) можно код посмотреть?  smile

вот собсно код
Код

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

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


Добавлено через 7 минут и 3 секунды
Если Вам это поможет, то вот код из С++, на который я опирался

Код

float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; 
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f-xhalf*x*x); 
return x;
}


PM MAIL   Вверх
Google
  Дата 26.5.2019, 12:05 (ссылка)  





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


 




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


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

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