Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.049 c
6-1096626563
Дмитрий Ботвин
2004-10-01 14:29
2004.12.12
Объём оперативки на удаленном компе


4-1098339093
Dema-X
2004-10-21 10:11
2004.12.12
CNTRL+A или как проэмулировать нажатие горячих клавиш?


1-1101249250
Кто---то
2004-11-24 01:34
2004.12.12
Как отследить где именно возникает утечка памяти ?


1-1101839603
Ищущий ответ
2004-11-30 21:33
2004.12.12
Почему не работает код?


4-1098805815
grom
2004-10-26 19:50
2004.12.12
Отлов вращения колесика мыши на иконке в трее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский