NaN根据Python启动提供错误?

时间:2010-10-14 13:50:58

标签: python delphi embedding

我正在使用Python4Delphi将Python嵌入到Delphi程序中。版本:Python 2.6.4,Delphi 2009,Windows XP。

导入json时,Delphi程序与EInvalidOp崩溃。我跟踪了它

NaN, PosInf, NegInf = float('nan'), float('inf'), float('-inf')
json.decoder中的

果然,命令float('nan')在Delphi程序中嵌入的Python内部运行时会引发EInvalidOp。在命令行Python(同一安装)中执行时,它只返回nan

知道Python标准启动和嵌入式启动之间有什么区别可能导致这样的错误?

2 个答案:

答案 0 :(得分:5)

这很可能是Python使用与Delphi不同的8087 control word(CW)设置。

试试这种代码:

var
  OldControlWord: Word;
begin
  OldControlWord := Get8087CW();
  Set8087CW($133F);
  try
    // perform your Python code here
  finally
    Set8087CW(OldControlWord);      
  end;
end;

有关$ 133F价值的更详细说明,请参阅我的blog article on the 8087 CW in Delphi 它需要T8087Precision类型的JCLJcl8087单位)。

- 的Jeroen

答案 1 :(得分:1)

我使用以下内容: $ 1332是delphi的默认值。 $ 1232是处理Python Issue 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;