Прииспользованиифункции StrToFloat() длязначения 1234.5544 яполучаючто-тотипа 1234.55440000000003, новедьэтонеправильно! Ничегоздесьнеправильногонет. Этопростопогрешностьчиселсплавающейточкой. Фактическиисточникомошибкиявляетсяошибкаокругления. Даннаяошибкаявляетсяследствиемдефектаарифметикиплавающейточкиитогофакта, чточащевсегодесятичныедробиявляютсяповторяющимисядолямивдвоичнойсистемесчисления. Такиечисланемогутпредставлятьсявконечномколичествебитов. Всвязисэтимтекстовоеокруглениеполучаетсяневсегдаточным, т.к. большинствокомпьютеровподбираетпоследниецифрыдробнойчасти, исходяизближайшего (снаименьшейразницей) эквивалента. Некоторыекомпьютерынепроизводятокругления, апростообрезают (выключают) последниебиты, получаярезультирующуюошибку, правильноназываемуюошибкойокругления (впротивоположностьошибкеусечения, когдаусекаетсярасширениеряда). Дляполучениядополнительнойинформацииобратитеськ Introduction to Numerical Methods (введениевчисловыеметоды) авторов Peter A. Stark, Macmillian Company, 1970. Из-заналичияошибкисравнениедвухчиселсплавающейточкойсводитсякучетуабсолютнойилиотносительнойпогрешности. Длясравнениядвухчиселсучетомабсолютнойпогрешностииспользуйтеследующийкод:

Code:

IF ABS(CalculatedValue - TrueValue) < FuzzValue then ...

 

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

Code:

IF ABS( (CalculatedValue - TrueValue) / TrueValue ) <

AcceptableRelativeError then ...

 

, где AcceptableRelativeError определяетвеличинуотносительнойпогрешности (ну, иконечно, TrueValue <> 0.0). Математеческиймодуль Delphi вычисляетотносительнуюпогрешностьследующимобразом (ноононевынесеновсекцию interface):

Code:

FUNCTION RelSmall(X, Y: Extended): Boolean;

{ Возвращаем Истину, если разница между X и Y незначительна }

CONST

C1: Double = 1E-15;

C2: Double = 1E-12;

BEGIN

Result := Abs(X) < (C1 + C2 * Abs(Y))

END;

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить