NaN дает ошибку в зависимости от запуска Python? - PullRequest
4 голосов
/ 14 октября 2010

Я использую 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 ]

5 голосов
/ 14 октября 2010

Скорее всего, Python использует настройку 8087 (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 ед.).

- Йероен

1 голос
/ 15 октября 2010

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