NaN выдает ошибку в зависимости от запуска Python?


Я использую Python4Delphi для встраивания Python в программу Delphi. Версии: Python 2.6.4, Delphi 2009, Windows XP.

Программа Delphi аварийно завершает работу с EInvalidOp при импорте json. Я проследил его до линии

NaN, PosInf, NegInf = float('nan'), float('inf'), float('-inf')

В json.decoder.

Конечно же, команда float('nan') вызывает EInvalidOp при запуске внутри Python, встроенного в программу Delphi. При выполнении в командной строке Python (та же установка) он просто возвращает nan.

Любая идея, что такое разница между стандартным запуском Python и встроенным, что может привести к такой ошибке?

2 4

2 ответа:

Это наиболее вероятно, что Python использует другую настройку 8087 control word (CW), чем Delphi.

Попробуйте такой код:

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

Смотрите мою статью в блогео 8087 CW в Delphi для более подробного объяснения значения $133F.
Ему нужен JCL для типа T8087Precision (который находится в блоке Jcl8087).

-- Йерун

Я использую следующее: $ 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;