NaN 是否因 Python 启动而报错?
我正在使用 Python4Delphi 把 Python 嵌入到 Delphi 程序中。我的版本是:Python 2.6.4,Delphi 2009,Windows XP。
当我在 Delphi 程序中导入 json
时,程序崩溃并出现 EInvalidOp 错误。我追踪到出错的代码行是
NaN, PosInf, NegInf = float('nan'), float('inf'), float('-inf')
在 json.decoder
中。
果然,命令 float('nan')
在 Delphi 程序中嵌入的 Python 里运行时会引发 EInvalidOp
错误。而在命令行的 Python(同样的安装)中运行时,它只是返回 nan
。
有没有人知道标准的 Python 启动和嵌入的 Python 启动之间有什么不同,导致会出现这样的错误?
2 个回答
1
我使用以下内容:
$1332 是 Delphi 的默认值。
$1232 是用来解决 Python 问题 9980 的值。
procedure MaskFPUExceptions(ExceptionsMasked : boolean);
begin
// if ExceptionsMasked then
// Set8087CW($1332 or $3F)
// else
// Set8087CW($1332);
if ExceptionsMasked then
Set8087CW($1232 or $3F)
else
Set8087CW($1232);
end;
5
这很可能是因为Python使用的8087控制字(CW)设置和Delphi不一样。
你可以试试这样的代码:
var
OldControlWord: Word;
begin
OldControlWord := Get8087CW();
Set8087CW($133F);
try
// perform your Python code here
finally
Set8087CW(OldControlWord);
end;
end;
想了解$133F这个值的详细解释,可以看看我在博客上的文章。
你还需要JCL库来使用T8087Precision
类型(这个类型在Jcl8087
单元里)。
--jeroen