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 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
分类:
Delphi 算法/数学
, Delphi 与 Halcon
标签:
Delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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月简报