Прииспользованиифункции 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; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!