Delphi Sytem单元 Set8087CW、Get8087CW、Default8087CW - FPU浮点值运算器

Delphi Sytem单元 Set8087CW、Get8087CW、Default8087CW -  FPU浮点值运算器

FPU:浮点运算器,Floating Point Unit的简写,浮点运算单元 是专门用于浮点运算的处理器,集成于CPU之内,效率高、执行快 (以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内。)

原型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure Set8087CW(NewCW: Word);
begin
  Default8087CW := NewCW;
  asm
        FNCLEX  // don't raise pending exceptions enabled by the new flags
{$IFDEF PIC}
        MOV     EAX,[EBX].OFFSET Default8087CW
        FLDCW   [EAX]
{$ELSE}
        FLDCW   Default8087CW
{$ENDIF}
  end;
end;
 
function Get8087CW: Word;
asm
        PUSH    0
        FNSTCW  [ESP].Word
        POP     EAX
end;
1
2
Default8087CW: Word = $1332;{ Default 8087 control word.  FPU control register is set to this value.   默认8087控制字。FPU控制寄存器设置为该值。
                                CAUTION:  Setting this to an invalid value could cause unpredictable behavior. 警告:将此值设置为无效值可能会导致不可预知的行为。 }

 

示例:

1
2
3
4
Set8087CW($1372):     //开FPU,   默认值(例外情况除外)为  $1372 =4978   $137F=4991
Set8087cw($133F):     //闭FPU  ,禁用所有FPU异常   $133F=4927    $1332 =4914 
Get8087CW;     //获取当前的FPU值
Default8087CW;  //获取FPU的默认值,系统运行后,默认是开启,即4978

     

示例及测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//滔Roy 2020.12.14
var
  Form1: TForm1;
  Saved8087CW: Word;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  if Saved8087CW=0 then Exit;    //防止没设定之前加载 ,否则报错: Invalid floating point operation.
  if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'No FPU Exceptions' then   //禁用后,不会抛出异常   结果:INF
    Set8087CW($133f);   { Disable all fpu exceptions. 禁用所有fpu异常。  $133F=4927  }
  if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'FPU Exceptions' then    //FPU开启后,运算会抛出异常  Floating point division by zero
    Set8087CW(Saved8087CW);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit3.Text := FloatToStr(StrToFloat(Edit1.Text) / StrToFloat(Edit2.Text));
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Items.Add('No FPU Exceptions');
  RadioGroup1.Items.Add('FPU Exceptions');
  RadioGroup1.ItemIndex := 2;
  Saved8087CW := Default8087CW;  // Save this because Set8087CW changes it.   保存此项是因为Set8087CW更改了它。
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Set8087CW(Saved8087CW); // Default value (with exceptions) is $1372.     默认值(例外情况除外)为 $1372
end;

 

 

 

   

创建时间:2020.12.14  更新时间:

 

posted on   滔Roy  阅读(884)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示