NaN 是否因 Python 启动而报错?

4 投票
2 回答
908 浏览
提问于 2025-04-16 05:29

我正在使用 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

撰写回答