Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибки в работе с FPU: Проблема преобразования текста в долготу в проектах на Pascal и Delphi

Delphi , Синтаксис , Типы и Переменные

Введение

Проблема, с которой столкнулись разработчики, связана с нестабильностью результатов преобразования текста в числовые значения долгот, используя язык программирования Pascal (Delphi). Это может быть вызвано различными факторами, включая глобальные переменные, инициализированные в начале работы программы, и внешние библиотеки, которые могут влиять на работу FPU (Floating Point Unit).

Описание проблемы

Разработчики обнаружили, что при выполнении тестов на различных машинах, один из тестов, который проверяет преобразование текста в долготу, давал разные результаты. Основная проблема была обнаружена в следующем коде:

procedure TTerminalNVCParserTest_Unit.TranslateGPS_ValidGPSString_ReturnsValidCoords;
const
  CStrGPS = 'N5145.37936E01511.8029';
var
  LLatitude, LLongitude: Integer;
  LLong: Double;
  LStrLong, LTmpStr: String;
  LFS: TFormatSettings;
begin
  // Инициализация переменной LFS
  FillChar(LFS, SizeOf(LFS), 0);
  LFS.DecimalSeparator := '.';
  // Преобразование текста в числовые значения
  LStrLong := Copy(CStrGPS, Pos('E', CStrGPS)+1, 10);
  LTmpStr := Copy(LStrLong,1,3);
  LLong := StrToFloatDef( LTmpStr, 0, LFS );
  LTmpStr := Copy(LStrLong,4,10);
  LLong := LLong + StrToFloatDef( LTmpStr, 0, LFS)*1/60;
  LLongitude := Round(LLong * 100000);
  // Проверка результата
  CheckEquals(1519671, LLongitude);
end;

Проблема заключалась в том, что в результате выполнения кода переменная LLongitude иногда принимала значение 1519671, а иногда 1519672. Это различие было связано с выполнением не связанного с преобразованием метода FormXtrMainImport.JvWizard1.SelectNextPage. Предполагалось, что проблема может быть связана с изменением режима округления FPU, однако после проверки выяснилось, что это не так.

Анализ и решение проблемы

При анализе проблемы было выявлено, что изменение режима работы FPU может быть вызвано внешними библиотеками, в частности, объектами COM, используемыми оболочкой ADO в Delphi. Это изменение не затрагивало режим округления, но изменяло контрольное поле точности FPU.

Для решения проблемы было предложено использовать функцию Get8087CW для сохранения текущего состояния FPU перед выполнением кода, который может изменить его, и затем восстановить состояние с помощью Set8087CW после выполнения.

Подтвержденный ответ

Для обеспечения стабильности результатов преобразования текста в числовые значения долгот, необходимо внимательно отслеживать изменения, которые могут быть внесены в FPU внешними библиотеками и объектами. Рекомендуется использовать функцию Get8087CW для сохранения текущего состояния FPU и Set8087CW для восстановления его после операций, которые могут изменить контрольное слово FPU.

Пример решения

type
  TFPControlState = record
    _8087CW: Word;
  end;

function GetFPControlState: TFPControlState;
begin
  Result._8087CW := Get8087CW;
end;

procedure RestoreFPControlState(const State: TFPControlState);
begin
  Set8087CW(State._8087CW);
end;

procedure FloatingPointNumberHorror;
var
  LLongitude: Integer;
  LFloatLon: Double;
  // Инициализация необходимых переменных
  ...
begin
  // Сохранение текущего состояния FPU
  var FPControlState: TFPControlState;
  FPControlState := GetFPControlState;
  try
    // Выполнение кода, который может изменить FPU
    ...
    // Преобразование и округление числа
    LFloatLon := 15 + 11.8029*1/60;
    LLongitude := Round(LFloatLon * 100000);
    // Восстановление состояния FPU
  finally
    RestoreFPControlState(FPControlState);
  end;
end;

Заключение

Разработчикам, работающим с FPU в проектах на Pascal и Delphi, важно осознавать, что нестабильность в результатах преобразования чисел может быть вызвана внешними факторами, такими как глобальные переменные и внешние библиотеки, которые могут влиять на контрольное слово FPU. Для обеспечения надежности и воспроизводимости результатов, следует применять методы сохранения и восстановления состояния FPU.

Создано по материалам из источника по ссылке.

Разработчики столкнулись с нестабильностью результатов преобразования текста в числовые значения долгот в языке программирования Pascal (Delphi) из-за возможного влияния внешних библиотек и объектов COM на режим работы FPU.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Типы и Переменные ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:15:15/0.0034980773925781/0