Berserker
Posts: 16657
|
|
16.07.2011 19:08 |
|
etoprostoya
Posts: 1809
|
Сопроцессор обрабатывает 80-битные числа с плавающей запятой. Не важно, вводишь ты 32-битный float или 64-битный double - это только на входе и выходе.
Если плагин будет использовать 64-битные double (хотя не вижу в этом смысла), то перед их использованием необходимо будет вызывать _control87(_PC_53, _MCW_PC), а после испоьзования _control87(_PC_24, _MCW_PC). Чтобы геройский код работал по-прежнему. Не при инициализации и деинициализации (attach, detach), а в той же функции, где идёт обработка чисел с плавающей запятой.
Я, конечно, это не проверял, но так, по-моему, должно быть.
Вообще, рекомендую в плагинах использовать SSE и SSE2, которые поддерживаются с 2000 года всеми процессорами и Виндами не младше 2000 (насчёт Линукса не знаю - их много). Это поможет избежать путаницы, да и в разы проще.
|
|
16.07.2011 20:13 |
|
etoprostoya
Posts: 1809
|
Ну, это понятно, просто вопрос был об использовании double. Вот я и описал, как его использовать ВНУТРИ плагина. Кто его знает, может кто захочет заняться высокоточными астрологическими расчётами =) вместо банальных недель монстров.
|
|
16.07.2011 21:18 |
|
hippocamus
Posts: 517
|
Без проблем прикручу астрокалендарь. Но ведь это не Земля... Там и планеты другие.
-= подпись Гиппокамуса =-
|
|
16.07.2011 23:07 |
|
feanor
Posts: 624
|
Quote: Вот я и описал, как его использовать ВНУТРИ плагина.
Внутри плагина обычный сишный/паскалевский код. О том, что там у FPU - пусть у компилятора ядро болит.
|
|
17.07.2011 10:17 |
|
etoprostoya
Posts: 1809
|
Паскалевский код, наверняка, будет такой, что будет только инициализация FPU для работы с double, а деинициализации не будет и весь код Героев не будет работать либо с момента подключения плагина (attach) либо с момента первого вызова функций плагина. Но это надо проверять.
|
|
17.07.2011 10:44 |
|
baratorch
Posts: 197
|
дык если даже и так, асм вставкой деинициализации в плагине решится проблема.
(This post was last modified: 17.07.2011 12:11 by baratorch.)
|
|
17.07.2011 12:11 |
|
etoprostoya
Posts: 1809
|
Ну, феанор, например, не собирается делать никаких ассемблерных вставок.
Я, по-прежнему не думаю, что кому-то понадобится использовать double в своих плагинах. Нужно просто предупредить, что двойную точность использовать не рекомендуется - этого хватит.
Точнее, двойную точность в FPU. SSE2 и более поздние использовать-то можно. Правда, упоминание об этом может только запутать
(This post was last modified: 17.07.2011 12:18 by etoprostoya.)
|
|
17.07.2011 12:17 |
|
hippocamus
Posts: 517
|
Единственное, где я использовал плавающие числа в ERM - это было определение клеток, попадающих и не попадающих в круг определённого радиуса.
Другое применение даже придумать трудНО, чтоб это было не за уши притянуто...
-= подпись Гиппокамуса =-
|
|
17.07.2011 12:36 |
|
Berserker
Posts: 16657
|
|
17.07.2011 17:17 |
|
Berserker
Posts: 16657
|
|
17.07.2011 17:49 |
|
etoprostoya
Posts: 1809
|
Вот первый попавшийся пример:
Code:
0061FA1E: fnstcw word ptr [esp+34h]; сохраняет предыдущее состояние
0061FA22: mov eax,dword ptr [esp+34h];
0061FA26: or eax,300h; ставит точность 80-бит
0061FA2B: mov dword ptr [esp+38h],eax;
0061FA2F: fldcw word ptr [esp+38h]; загружает контрольное слово с новой точностью
0061FA33: fmul qword ptr ds:[006901ACh]; умножение с высокой точностью
0061FA39: fldcw word ptr [esp+34h]; загружает предыдущее состояние.
А ты говоришь, не меняет контрольное слово) Да там несколько десятков мест, где оно изменяется - но в основном это, похоже, контроль ошибок и округления.
P.S. Кстати, портировал плагин Семёна в MSVC 2008. Но пока ещё практически не тестил.
(This post was last modified: 17.07.2011 18:14 by etoprostoya.)
|
|
17.07.2011 18:10 |
|
Berserker
Posts: 16657
|
|
17.07.2011 18:15 |
|