Форум: "Потрепаться";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизЗачем делать Set8087CW после вызова WinApi функций? Найти похожие ветки
← →
Piter © (2004-11-21 17:04) [0]Какой смысл в таком коде:
function CreateWindowEx(dwExStyle: DWORD; lpClassName: PChar;
lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle,
X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
CreateWindowEx сбивает настройки?
И вообще, как я понял - эти функции Get8087CW/Set8087CW узнают/задают точность представления дробных числе... но я никак не пойму - зачем это? И что вообще за точность? Как она влияет на результаты, можно практические примеры?
Вот допустим у нас есть 8 байтное число с плавающей запятой, наприер Double. Из его размерности уже следует диапазон возможных чисел и точность их представления. Разве не так? Как влияет тогда Set8087CW?
И зачем вообще восстанавливать точность, это критично?
← →
Anatoly Podgoretsky © (2004-11-21 17:09) [1]Флаги соопроцессора описаны в документации по процессорам интел, в частности по семейству x86, частично есть информация в исходниках VCL
← →
Piter © (2004-11-21 17:48) [2]легче мне почему-то не стало
← →
Anatoly Podgoretsky © (2004-11-21 17:55) [3]Ну так надо немного потрудиться, а в данном примере, видимо функция меняет контрольное слово, поэтому и приняты меры
← →
GuAV © (2004-11-21 18:34) [4]Piter © (21.11.04 17:04)
Вот допустим у нас есть 8 байтное число с плавающей запятой, наприер Double. Из его размерности уже следует диапазон возможных чисел и точность их представления. Разве не так?
Так. однако это было про точность представления. что касается точности вычисления, то она зависит не от типа а от этого 87CW
Piter © (21.11.04 17:04)
Как влияет тогда Set8087CW
Влияет на точность представления, способ округления и на то будет ли исключение в того или инго типа поднято.
Если не хочешь смотреть доку по процессорам, то Set8087CW+F1+See also
Также прочитай: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
← →
Piter © (2004-11-21 18:52) [5]Ну то, что она меняет я и так в общем догадался.
Вопросы вот какие:
1) чем критично, что будет поменено контрольное слово?
2) это просто баг windows, что при вызове CreateWindow меняется контрольное слово?
Или это зачем то нужно?
3) можно пример, когда результат чего-либо зависит от установок контрольного слова?
← →
Anatoly Podgoretsky © (2004-11-21 18:54) [6]Piter © (21.11.04 18:52) [5]
1. Будут неверные результаты, если контрольное слово неправильно
2. Нет не баг, сам Борланд его также многократно меняет
3. Например Round
← →
GuAV © (2004-11-21 19:02) [7]Piter © (21.11.04 18:52) [5]
3) можно пример, когда результат чего-либо зависит от установок контрольного слова?X := 0;
Result := 1/X;
← →
Piter © (2004-11-21 19:11) [8]GuAV © (21.11.04 18:34) [4]
Так. однако это было про точность представления. что касается точности вычисления
и далее:
GuAV © (21.11.04 18:34) [4]
Влияет на точность представления
Так все таки влияет на точность представления или нет?
А что касается выяислений - то не очевидно их проводить с наивысшей точностью?
← →
Anatoly Podgoretsky © (2004-11-21 19:13) [9]Ну посмотри ты наконец инструкцию по процессору, сразу все вопросы снимет.
← →
Anatoly Podgoretsky © (2004-11-21 19:14) [10]У тебя странный метод изучения, надо сначала смотреть первоисточник и потом задавать вопросы по неясным моментам, иначе неэффективно и расточительно.
← →
Piter © (2004-11-21 19:18) [11]Нет не баг, сам Борланд его также многократно меняет
ну может это где нужно. А вот зачем менять данный параметр функции CreateWindowEx?! Все таких по ходу дела это баг...
← →
Anatoly Podgoretsky © (2004-11-21 19:19) [12]Piter © (21.11.04 19:18) [11]
Для этого надо смотреть исходники CreateWindowEx, а они недоступны.
← →
GuAV © (2004-11-21 19:19) [13]Piter © (21.11.04 19:11) [8]
и далее:
GuAV © (21.11.04 18:34) [4]
Влияет на точность представления
вычисления конечно же.
Piter © (21.11.04 19:11) [8]
то не очевидно их проводить с наивысшей точностью?
Нет.
← →
Игорь Шевченко © (2004-11-21 19:31) [14]Piter © (21.11.04 17:04)
А если не секрет, где ты такой код нашел ?
← →
GuAV © (2004-11-21 19:39) [15]Игорь Шевченко © (21.11.04 19:31) [14]
CreateWindowEx
windows.pas
← →
Piter © (2004-11-21 19:42) [16]Anatoly Podgoretsky © (21.11.04 19:13) [9]
Ну посмотри ты наконец инструкцию по процессору
А где я ее посмотрю?
← →
Piter © (2004-11-21 19:45) [17]Игорь Шевченко © (21.11.04 19:31) [14]
А если не секрет, где ты такой код нашел ?
GuAV в [15] ответил. Более того, этот код реально используется. Например:procedure TCustomForm.CreateWnd;
...
FClientHandle := Windows.CreateWindowEx
...
такое ощущение, что данная реализация специально введена для предотвращения какого-то глюка винды, при котором меняется управляющее слово. Вот только как оно меняется и как сказывается на работе программы?
← →
Anatoly Podgoretsky © (2004-11-21 19:47) [18]Производитель Интел, на их сайте гигабайты информации, исключительно по процессору есть копия на моем сайте, кроме того там есть пара книг на русском языке, где это вроде рассмотрено, но не уверен.
← →
Игорь Шевченко © (2004-11-21 19:50) [19]GuAV © (21.11.04 19:39) [15]
Я наверное слепой. В D6 такого нету, однако окна создаются без проблем.
← →
GuAV © (2004-11-21 19:56) [20]Игорь Шевченко © (21.11.04 19:50) [19]
В D6 такого нету
Возможно в D6 нету, но в D7 есть.
Игорь Шевченко © (21.11.04 19:50) [19]
окна создаются без проблем.
Проблемы не будет при создании окон.
Однако Coprocessor Control Word может быть изменено после этой функции.
В win2k это вряд ли проявится, скорее всего ото так в 9x.
← →
Piter © (2004-11-21 20:17) [21]Игорь Шевченко © (21.11.04 19:50) [19]
У меня D7. А как выглядит вызов в:
procedure TCustomForm.CreateWnd;
...
FClientHandle := Windows.CreateWindowEx
...
Что вместо Windows.CreateWindowEx? Просто CreateWindowEx?
← →
Игорь Шевченко © (2004-11-21 20:19) [22]Piter © (21.11.04 20:17) [21]
FClientHandle := Windows.CreateWindowEx ...
GuAV © (21.11.04 19:56) [20]
> Однако Coprocessor Control Word может быть изменено после
> этой функции
На основании чего такой вывод ?
← →
Anatoly Podgoretsky © (2004-11-21 20:22) [23]Игорь Шевченко © (21.11.04 20:19) [22]
Некоторые функции виндоус меняют контрольное слово, это рассматривалось в конференциях Борланда. Видимо после этого и появилось сохранение.
← →
GuAV © (2004-11-21 20:55) [24]
procedure TForm1.Button1Click(Sender: TObject);
var CW1, CW2: Word;
begin
Set8087CW($1372); // any control word
CW1 := Get8087CW;
DestroyWindow(_CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "",WS_POPUP,
0, 0, 0, 0, 0, 0, SysInit.HInstance, nil));
CW2 := Get8087CW;
ShowMessageFmt("%.4X %.4x", [CW1, CW2]);
end;
Этот код в 98se показывает что Coprocessor Control Word не меняется. Вероятно проблема существует в более раних версиях Windows. Вывод сделан на основании сохранения CW в D7.
← →
Piter © (2004-11-21 21:42) [25]Игорь Шевченко © (21.11.04 20:19) [22]
FClientHandle := Windows.CreateWindowEx ...
а каков код функции: Windows.CreateWindowEx ?
← →
Игорь Шевченко © (2004-11-21 22:16) [26]Piter © (21.11.04 21:42) [25]
function CreateWindowEx; external user32 name "CreateWindowExA";
← →
Piter © (2004-11-22 00:45) [27]Игорь Шевченко © (21.11.04 22:16) [26]
ясно. Значит, в D7 изменили...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.047 c