Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 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   Вверх
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   Вверх
Guinness
Дата 1.7.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  20:26 Найти цитируемый пост)
это нормально? или расчёты ошибочны?

Да я вот что-то тоже не понимаю, почему не получается, сейчас прогоняю. На крестах работало все)
PM MAIL   Вверх
stinker
Дата 1.7.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ого, всё разобрался! прям огромнющее спасибо вам!
последний вопрос- как задать повторение итеранции, т.е последней строки?

Добавлено через 1 минуту и 34 секунды
Цитата(Guinness @  1.7.2013,  19:38 Найти цитируемый пост)
Да я вот что-то тоже не понимаю, почему не получается, сейчас прогоняю. На крестах работало все) 

просто итерация метода ньютона даёт приближенное число, при большем повторении число уточняется! я повторил его n-число раз, т.е жал F9 около20 раз и число стало точным ответом!
PM MAIL   Вверх
Guinness
Дата 1.7.2013, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я может что не понимаю, но bitshift что-то не то делает

Добавлено через 49 секунд
Цитата(stinker @  1.7.2013,  20:38 Найти цитируемый пост)
просто итерация метода ньютона даёт приближенное число, при большем повторении число уточняется! я повторил его n-число раз, т.е жал F9 около20 раз и число стало точным ответом!

у меня на первом шаге на плюсах было отличие в 6 знаке
PM MAIL   Вверх
stinker
Дата 1.7.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @  1.7.2013,  19:40 Найти цитируемый пост)
я может что не понимаю, но bitshift что-то не то делает

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


Опытный
**


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

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



Цитата(stinker @  1.7.2013,  20:43 Найти цитируемый пост)
изначально разбирался на двоичных кодах, логическое смещение вправо вроде работает исправно

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


Новичок



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

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



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


Опытный
**


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

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



В общем все понятно, мы hex2num переводим в double, а нам нужно в single.
решение
PM MAIL   Вверх
stinker
Дата 1.7.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  19:53)
В общем все понятно, мы hex2num переводим в double, а нам нужно в single.
решение

Тоесть нужно добавить single в hex2num?

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


Опытный
**


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

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



Код

x = single(25); 
half = 0.5*x;

strX = num2hex(x);
intX = hex2dec(strX);
magicNum = hex2dec('5f3759df');
i = magicNum - bitshift(intX,-1);
x = typecast( uint32(i) ,'single'); 
res = x*(1.5 - half*x*x);

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


Новичок



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

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



Цитата(Guinness @ 1.7.2013,  20:02)
Код

x = single(25); 
half = 0.5*x;

strX = num2hex(x);
intX = hex2dec(strX);
magicNum = hex2dec('5f3759df');
i = magicNum - bitshift(intX,-1);
x = typecast( uint32(i) ,'single'); 
res = x*(1.5 - half*x*x);

В общем, вот что получилось.

значит вся проблема была в double
приближенное значение с разницей в 0,0002 smile 
Большое спасибо Вам за помощь и обьяснение!

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


 




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


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

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