|
|
|
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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); |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Как Вы думаете, что делают операторы uint32 и double? Если знаете, то именно это Вы хотели получить?
|
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
unit32- переводим число в целое, согласно алгоритму нужно 32-битное double- переводим обратно в число с плавающей запятой, также согласно алгоритму. если я не прав поправьте пожалуйста |
|||
|
||||
Guinness |
|
||||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
В общем-то, в гугле вторая ссылка(пример на яве) все бы Вам разъяснила. На самом деле Вам нужно представление числа double как 32-битное целое. А этими операциями Вы преобразуете число double к uint32 и соответственно обратно.
|
||||
|
|||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Эти ссылки я смотрел, и ещё пару десятков. Не очень силён в языках поэтому и обращаюсь за помощью. Тоесть Вы хотите сказать что double в конце не нужен? Добавлено через 1 минуту и 38 секунд сейчас код выглядит вот так
Добавлено через 3 минуты и 58 секунд Следуя алгоритму представление числа как 32-битное целое нужно на этапе вычитания из магического числа, при вычислении метода Ньютона нужно снова число с плавающей запятой. Если не прав поправте пожалуйста. |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Все так. Просто число double - это знаковый бит + эскспонента + мантисса. И Вам нужно именно это представление, а не перевод из double в uint как я показывал постом выше. Понятно? |
|||
|
||||
stinker |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Тоесть если я Вас правильно понял из double в unit перевод не нужен? тогда каким же образом можно представить число как целое? просто убрав unit изменений в конечном результате нет. Большое спасибо, что помогаете. |
||||
|
|||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
В общем, не буду Вас мучить. Вот ссылки на две функции, которые Вам нужны:
вместо uint32() вместо double Если не ошибаюсь, они Вам помогут. Проверьте на каких либо простых значениях, типа 25, 36 и т.п. Матлаба под рукой нет, так что у себя проверить не могу. Если нужно могу на C++ выложить. |
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Как я понимаю мне нужно согласно алгоритму предствавить не в double(двойной точности), а в одинарной точности. Не могли бы Вы подсказать каким образом?
|
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
float, это не работает?
|
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Большое спасибо! Но при замене, теперь выходит ошибка логического сдвига "Undefined function or method 'bitshift' for input arguments of type 'char'." |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
||||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
большое спасибо за обьяснение, это сработало. Но теперь у меня возник вопрос- уместен ли hex2num вместо double, если мы уже провели hex2dec?
нужно ли в промежутке сделать hex2dec, а после провести hex2num? Добавлено через 2 минуты и 57 секунд
вот собсно код
Добавлено через 7 минут и 3 секунды Если Вам это поможет, то вот код из С++, на который я опирался
|
||||||
|
|||||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Да, я прочёл её уже не первый раз, уже доходил до этой ссылки, в случае с unit выдаёт ошибку, в случае с double '4046800000000000' хотел это сделать перед итерацией, но увы, также выдёт ошибку. Добавлено через 6 минут и 14 секунд Вы указали, что double нужно заменить на hex2num, но поясните пожалуйста, зачем? ведь вычисление до double уже было в hex2dec? Это сообщение отредактировал(а) stinker - 1.7.2013, 15:37 |
||||
|
|||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
num2hex должен просто перевести число в шестнадцатеричное, т.е например 29 это 1D. матлаб же показывает что 29 это 4a191c2b54d4c50a.
я просто неправ или оно так и должно Добавлено @ 16:07 Огроное спасибо за помощь, но теперь я вообще запутался чего матлаб от меня хочет даже переводя числа, они всеравно в результате остаются с большими степенями изза магического числа. помогите пожалуйста с этим безумным кодом Это сообщение отредактировал(а) stinker - 1.7.2013, 16:08 |
|||
|
||||
Guinness |
|
||||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Вы немного не так прочитали описание данной функции + пока не понимаете, что такое double. 1D - это представление 29 как целого числа. Добавлено @ 16:14
Ибо double большеват для этого преобразования. Это сообщение отредактировал(а) Guinness - 1.7.2013, 16:15 |
||||
|
|||||
stinker |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Но ведь в данном случае мне и нужно сделать его представлением целого, так ведь? Добавлено через 2 минуты и 19 секунд
тогда при выполнении этого выдаёт ??? Input argument "ExpBits" is undefined. Error in ==> float at 54 DAStudio.error('Shared:numericType:customFloatSupportRemove', TotalBits, ExpBits ); Добавлено через 5 минут и 27 секунд может быть это изза старого матлаба? |
||||||
|
|||||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Да, но double в памяти хранится как число, которое делится на 3 части: знак + экспонента + мантисса. Тип int хранится как обычное число в двоичном виде: знак + значение. И Вам в алгоритме от double нужно представление как он хранится в памяти. В алгоритме на c++ происходят следующие вещи: 1) &x - мы передаем адрес на ячейку памяти, в которой хранится число double(знак + экспонента + мантисса) 2) (uint32 *)&x - говорим, что указатель указывает на ячейку памяти простое целое беззнаковое число(знак + значение) 3) *( (uint32 *)&x ) - значение находящееся по данному адресу как число uint32. Т.е. мы берем представление числа double как оно хранится в памяти компьютера. |
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
судя по хелперу float может задавать только структуру значения, при этом конкретное значение не присвоить.
пример из тогоже хелпера
|
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
вместо double по идее нужен single, т.к по алгоритму идут числа с одинарной точностью?
|
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
по идее ведь float в маткаде это и есть double?
Добавлено через 12 минут и 39 секунд хотя нет, при single получается отрицательное число.. |
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Помогите пожалуйста доделать программу, очень прошу)
пользовался вот этой литературой, но далеко не продвинулся. помогите пожалуйста) А то уже за вторую неделю мозг в кашу Это сообщение отредактировал(а) stinker - 1.7.2013, 18:24 |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Да, похоже нужно single использовать. С чем у Вас ещё проблемы остались?
|
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
на данный момент код выглядит так:
какие в коде сейчас ошибки и обьясните пожалуйста как их можно исправить очень прошу, просто давно с этим кодом бьюсь, вроде и исправляю а результат тотже. в ответе явно не обратный корень, отрицательное число в безумной степени явно не то( Добавлено через 1 минуту и 47 секунд а по сути от сингла мало что изменилось, результат даже значения не сменил |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
x = single(i);
меняем на x = single( hex2num( dec2hex( i ) ) ); Это сообщение отредактировал(а) Guinness - 1.7.2013, 19:23 |
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
в результате выходит значение "-Inf", минус бесконечность собсна Добавлено @ 19:33 ой, извините, не в ту программу код поставил) теперь понял что нужно было обращать i обратно в hex, потом в num, прям прояснило) Добавлено @ 19:34 огромное спасибо что помогли! так, если в результате у нас должен быть обратный квадратный корень, к примеру 29, то 1/sqrt(29)=0.185695338177052 а у нас по результатам кода выходит 1.3516559e-08 это нормально? или расчёты ошибочны? Это сообщение отредактировал(а) stinker - 1.7.2013, 19:35 |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
ого, всё разобрался! прям огромнющее спасибо вам!
последний вопрос- как задать повторение итеранции, т.е последней строки? Добавлено через 1 минуту и 34 секунды
просто итерация метода ньютона даёт приближенное число, при большем повторении число уточняется! я повторил его n-число раз, т.е жал F9 около20 раз и число стало точным ответом! |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
я может что не понимаю, но bitshift что-то не то делает
Добавлено через 49 секунд
у меня на первом шаге на плюсах было отличие в 6 знаке |
|||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
||||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
может стоит задать цикл?
|
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
stinker |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
Тоесть нужно добавить single в hex2num? Это сообщение отредактировал(а) stinker - 1.7.2013, 19:59 |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
В общем, вот что получилось. |
|||
|
||||
stinker |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.7.2013 Репутация: нет Всего: нет |
значит вся проблема была в double приближенное значение с разницей в 0,0002 Большое спасибо Вам за помощь и обьяснение! Это сообщение отредактировал(а) stinker - 1.7.2013, 20:17 |
||||
|
|||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Математические пакеты | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |