|
|
|
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 секунды Если Вам это поможет, то вот код из С++, на который я опирался
|
||||||
|
|||||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Математические пакеты | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |