gpt4 book ai didi

delphi - 当 FPU 控制字更改时,FloatToStr 返回不精确的值

转载 作者:行者123 更新时间:2023-12-03 18:57:06 24 4
gpt4 key购买 nike

我正在使用 Delphi 7,现在 FloatToStr(64)返回

64,0000017441



在使用 Direct3D 代码的同一进程中加载​​不同的模块时。

返回值为

64



正如预期的那样,当另一个模块在进程中不活动时。

为什么 FloatToStr() 的输出会根据执行的其他不相关代码而变化,以及如何始终获得可靠且一致的浮点值字符串表示?

FloatToStr() 的行为差异可以在以下示例代码中看到:
{$APPTYPE CONSOLE}
program Project1;
uses
SysUtils;
begin
Writeln('FloatToStr(64) = ', FloatToStr(64));
Set8087CW(Get8087CW and $FCFF);
Writeln('FloatToStr(64) = ', FloatToStr(64));
end.

最佳答案

在国外的插件代码中,在“display.cpp”的代码中

hr = d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, 
D3DCREATE_NOWINDOWCHANGES | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
&d3dpp, &d3ddev );

添加标志“D3DCREATE_FPU_PRESERVE”,使代码为:
hr = d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, 
D3DCREATE_NOWINDOWCHANGES | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE,
&d3dpp, &d3ddev );

如果省略此代码,Direct 3D 会更改 FPU 用于当前线程的精度,您将看到不太精确的值。

另见 http://blogs.msdn.com/b/tmiller/archive/2004/06/01/145596.aspx

另一种选择(当您不能或不想更改其他插件代码时)是在显示浮点值时使用显式格式。

采用
   s:= FormatFloat('0.##', x);

代替
   s:= FloatToStr(X);

这将始终将值四舍五入到小数点后两位,并且在小数分隔符后不显示尾随零。当最高两位为 0 时,它不会显示任何小数分隔符。

另一种选择是让您的代码在单独的线程中运行,因为 FPU 精度设置是每个线程的。

另一种选择是执行
 Reset8087CW;

在调用 FloatToStr() 之前在您的代码中。但是,这可能会干扰 Direct3D 并在那里产生错误。

关于delphi - 当 FPU 控制字更改时,FloatToStr 返回不精确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com