Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дробные вычисления 
:(
    Опции темы
Keeper89
Дата 17.3.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Доброго времени суток.

Вопрос касающийся вычислений (для типа Double): вычисляю выражение
Цитата

1,75 - (-2,75*(-1,75)) / 2,75

Должен быть 0, но в переменную заносится число
Цитата

-1,11022302462516E-016

Можно как-то избавиться от этой погрешности?


--------------------
PM MAIL WWW   Вверх
former
Дата 17.3.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 4
Всего: 17



Цитата(Keeper89 @  17.3.2010,  20:37 Найти цитируемый пост)
Можно как-то избавиться от этой погрешности? 

Keeper89, проблема, скорее всего в другом. 
Получил 0 со следующим кодом:
Код

procedure TForm1.Button1Click(Sender: TObject);
var a: Double;
begin
  a := 1.75 - (-2.75*(-1.75)) / 2.75;
  Label1.Caption := FloatToStr(a);
end;



--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
RomanEEP
Дата 17.3.2010, 21:40 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Избавиться очень сложно, в общем случае - невозможно. Решается определением своих типов данных в которых числа хранятся без потери точности и поределением операций над ними.
Как правило при вычислениях чисел с плавающей точкой просто округляют до нужноо знака, нпример до тысячных и пользователь этой погрешности не увидит.
PM MAIL   Вверх
Keeper89
Дата 17.3.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



former, да, у меня это работает, но вот в вычислениях не получается smile

RomanEEP, ясно, подумаю над этим.

Вот, какие числа получаются в процессе решения:
Код

(0, 0) 0-(3,25*0)/2,75=0
(0, 1) 0-(3,25*0)/2,75=0
(0, 2) -1,25-(3,25*-0,75)/2,75=-0,363636363636364
(0, 3) -2-(3,25*-1)/2,75=-0,818181818181819
(0, 4) -1-(3,25*-1)/2,75=0,181818181818181
(0, 5) -2,25-(3,25*-1,75)/2,75=-0,181818181818183
(0, 6) -2-(3,25*-2)/2,75=0,363636363636363
(0, 7) 0-(3,25*0)/2,75=0
(0, 8) 0-(3,25*0)/2,75=0
(0, 9) -0,75-(3,25*-0,25)/2,75=-0,454545454545455
(0, 10) 1-(3,25*0)/2,75=1
(0, 11) 0,25-(3,25*-0,25)/2,75=0,545454545454545
(0, 12) -0,25-(3,25*0,25)/2,75=-0,545454545454545
(0, 13) -1,25-(3,25*-0,75)/2,75=-0,363636363636364
(0, 15) 0-(3,25*0)/2,75=0
(0, 16) 0-(3,25*0)/2,75=0
(0, 17) 0-(3,25*0)/2,75=0
(0, 18) 0-(3,25*0)/2,75=0
(0, 19) 0-(3,25*0)/2,75=0
(0, 20) 0-(3,25*0)/2,75=0
(0, 21) 1,75-(3,25*1,25)/2,75=0,272727272727273
(0, 22) 0-(3,25*1)/2,75=-1,18181818181818
(0, 23) 0-(3,25*0)/2,75=0
(1, 0) 0-(1,5*0)/2,75=0
(1, 1) 1-(1,5*0)/2,75=1
(1, 2) 0,5-(1,5*-0,75)/2,75=0,909090909090909
(1, 3) 0-(1,5*-1)/2,75=0,545454545454545
(1, 4) 0-(1,5*-1)/2,75=0,545454545454545
(1, 5) -0,5-(1,5*-1,75)/2,75=0,454545454545455
(1, 6) -1-(1,5*-2)/2,75=0,0909090909090911
(1, 7) 0-(1,5*0)/2,75=0
(1, 8) 0-(1,5*0)/2,75=0
(1, 9) 0,5-(1,5*-0,25)/2,75=0,636363636363636
(1, 10) 0-(1,5*0)/2,75=0
(1, 11) -0,5-(1,5*-0,25)/2,75=-0,363636363636364
(1, 12) 0,5-(1,5*0,25)/2,75=0,363636363636364
(1, 13) -0,5-(1,5*-0,75)/2,75=-0,0909090909090909
(1, 15) 0-(1,5*0)/2,75=0
(1, 16) 0-(1,5*0)/2,75=0
(1, 17) 0-(1,5*0)/2,75=0
(1, 18) 0-(1,5*0)/2,75=0
(1, 19) 0-(1,5*0)/2,75=0
(1, 20) 0-(1,5*0)/2,75=0
(1, 21) -0,5-(1,5*1,25)/2,75=-1,18181818181818
(1, 22) 0-(1,5*1)/2,75=-0,545454545454545
(1, 23) 0-(1,5*0)/2,75=0
(2, 0) 0-(-2,75*0)/2,75=0
(2, 1) 0-(-2,75*0)/2,75=0
(2, 2) 0,75-(-2,75*-0,75)/2,75=-1,11022302462516E-016
(2, 3) 1-(-2,75*-1)/2,75=0
(2, 4) 1-(-2,75*-1)/2,75=0
(2, 5) 1,75-(-2,75*-1,75)/2,75=0
(2, 6) 2-(-2,75*-2)/2,75=-2,22044604925031E-016
(2, 7) 0-(-2,75*0)/2,75=0
(2, 8) 1-(-2,75*0)/2,75=1
(2, 9) 0,25-(-2,75*-0,25)/2,75=0
(2, 10) 0-(-2,75*0)/2,75=0
(2, 11) 0,25-(-2,75*-0,25)/2,75=-2,77555756156289E-017
(2, 12) -0,25-(-2,75*0,25)/2,75=2,77555756156289E-017
(2, 13) 0,75-(-2,75*-0,75)/2,75=-1,11022302462516E-016
(2, 15) 0-(-2,75*0)/2,75=0
(2, 16) 0-(-2,75*0)/2,75=0
(2, 17) 0-(-2,75*0)/2,75=0
(2, 18) 0-(-2,75*0)/2,75=0
(2, 19) 0-(-2,75*0)/2,75=0
(2, 20) 0-(-2,75*0)/2,75=0
(2, 21) -1,25-(-2,75*1,25)/2,75=0
(2, 22) 0-(-2,75*1)/2,75=1
(2, 23) 0-(-2,75*0)/2,75=0
(3, 0) 1-(1*0)/2,75=1
(3, 1) 0-(1*0)/2,75=0
(3, 2) 0-(1*-0,75)/2,75=0,272727272727273
(3, 3) 0-(1*-1)/2,75=0,363636363636364
(3, 4) 0-(1*-1)/2,75=0,363636363636364
(3, 5) 0-(1*-1,75)/2,75=0,636363636363636
(3, 6) 0-(1*-2)/2,75=0,727272727272727
(3, 7) 0-(1*0)/2,75=0
(3, 8) 0-(1*0)/2,75=0
(3, 9) 0-(1*-0,25)/2,75=0,0909090909090909
(3, 10) 0-(1*0)/2,75=0
(3, 11) 0-(1*-0,25)/2,75=0,0909090909090909
(3, 12) 0-(1*0,25)/2,75=-0,0909090909090909
(3, 13) 0-(1*-0,75)/2,75=0,272727272727273
(3, 15) 0-(1*0)/2,75=0
(3, 16) 0-(1*0)/2,75=0
(3, 17) 0-(1*0)/2,75=0
(3, 18) 0-(1*0)/2,75=0
(3, 19) 0-(1*0)/2,75=0
(3, 20) 0-(1*0)/2,75=0
(3, 21) 0-(1*1,25)/2,75=-0,454545454545455
(3, 22) 0-(1*1)/2,75=-0,363636363636364
(3, 23) 0-(1*0)/2,75=0
(4, 0) 0-(-1,5*0)/2,75=0
(4, 1) 0-(-1,5*0)/2,75=0
(4, 2) -0,5-(-1,5*-0,75)/2,75=-0,909090909090909
(4, 3) 0-(-1,5*-1)/2,75=-0,545454545454545
(4, 4) 0-(-1,5*-1)/2,75=-0,545454545454545
(4, 5) 0,5-(-1,5*-1,75)/2,75=-0,454545454545455
(4, 6) 1-(-1,5*-2)/2,75=-0,0909090909090911
(4, 7) 0-(-1,5*0)/2,75=0
(4, 8) 0-(-1,5*0)/2,75=0
(4, 9) -0,5-(-1,5*-0,25)/2,75=-0,636363636363636
(4, 10) 0-(-1,5*0)/2,75=0
(4, 11) 0,5-(-1,5*-0,25)/2,75=0,363636363636364
(4, 12) -0,5-(-1,5*0,25)/2,75=-0,363636363636364
(4, 13) 0,5-(-1,5*-0,75)/2,75=0,0909090909090909
(4, 15) 1-(-1,5*0)/2,75=1
(4, 16) 0-(-1,5*0)/2,75=0
(4, 17) 0-(-1,5*0)/2,75=0
(4, 18) 0-(-1,5*0)/2,75=0
(4, 19) 0-(-1,5*0)/2,75=0
(4, 20) 0-(-1,5*0)/2,75=0
(4, 21) 0,5-(-1,5*1,25)/2,75=1,18181818181818
(4, 22) 0-(-1,5*1)/2,75=0,545454545454545
(4, 23) 0-(-1,5*0)/2,75=0
(5, 0) 0-(0*0)/2,75=0
(5, 1) 0-(0*0)/2,75=0
(5, 2) 1-(0*-0,75)/2,75=1
(5, 3) 0-(0*-1)/2,75=0
(5, 4) 0-(0*-1)/2,75=0
(5, 5) 0-(0*-1,75)/2,75=0
(5, 6) 0-(0*-2)/2,75=0
(5, 7) 0-(0*0)/2,75=0
(5, 8) 0-(0*0)/2,75=0
(5, 9) 0-(0*-0,25)/2,75=0
(5, 10) 0-(0*0)/2,75=0
(5, 11) 0-(0*-0,25)/2,75=0
(5, 12) 0-(0*0,25)/2,75=0
(5, 13) 0-(0*-0,75)/2,75=0
(5, 15) 0-(0*0)/2,75=0
(5, 16) 1-(0*0)/2,75=1
(5, 17) 0-(0*0)/2,75=0
(5, 18) 0-(0*0)/2,75=0
(5, 19) 0-(0*0)/2,75=0
(5, 20) 0-(0*0)/2,75=0
(5, 21) 0-(0*1,25)/2,75=0
(5, 22) 0-(0*1)/2,75=0
(5, 23) 0-(0*0)/2,75=0
(6, 0) 0-(0*0)/2,75=0
(6, 1) 0-(0*0)/2,75=0
(6, 2) 0-(0*-0,75)/2,75=0
(6, 3) 1-(0*-1)/2,75=1
(6, 4) 0-(0*-1)/2,75=0
(6, 5) 0-(0*-1,75)/2,75=0
(6, 6) 0-(0*-2)/2,75=0
(6, 7) 0-(0*0)/2,75=0
(6, 8) 0-(0*0)/2,75=0
(6, 9) 0-(0*-0,25)/2,75=0
(6, 10) 0-(0*0)/2,75=0
(6, 11) 0-(0*-0,25)/2,75=0
(6, 12) 0-(0*0,25)/2,75=0
(6, 13) 0-(0*-0,75)/2,75=0
(6, 15) 0-(0*0)/2,75=0
(6, 16) 0-(0*0)/2,75=0
(6, 17) 1-(0*0)/2,75=1
(6, 18) 0-(0*0)/2,75=0
(6, 19) 0-(0*0)/2,75=0
(6, 20) 0-(0*0)/2,75=0
(6, 21) 0-(0*1,25)/2,75=0
(6, 22) 0-(0*1)/2,75=0
(6, 23) 0-(0*0)/2,75=0
(7, 0) 0-(0*0)/2,75=0
(7, 1) 0-(0*0)/2,75=0
(7, 2) 0-(0*-0,75)/2,75=0
(7, 3) 0-(0*-1)/2,75=0
(7, 4) 1-(0*-1)/2,75=1
(7, 5) 0-(0*-1,75)/2,75=0
(7, 6) 0-(0*-2)/2,75=0
(7, 7) 0-(0*0)/2,75=0
(7, 8) 0-(0*0)/2,75=0
(7, 9) 0-(0*-0,25)/2,75=0
(7, 10) 0-(0*0)/2,75=0
(7, 11) 0-(0*-0,25)/2,75=0
(7, 12) 0-(0*0,25)/2,75=0
(7, 13) 0-(0*-0,75)/2,75=0
(7, 15) 0-(0*0)/2,75=0
(7, 16) 0-(0*0)/2,75=0
(7, 17) 0-(0*0)/2,75=0
(7, 18) 1-(0*0)/2,75=1
(7, 19) 0-(0*0)/2,75=0
(7, 20) 0-(0*0)/2,75=0
(7, 21) 0-(0*1,25)/2,75=0
(7, 22) 0-(0*1)/2,75=0
(7, 23) 0-(0*0)/2,75=0
(8, 0) 0-(0*0)/2,75=0
(8, 1) 0-(0*0)/2,75=0
(8, 2) 0-(0*-0,75)/2,75=0
(8, 3) 0-(0*-1)/2,75=0
(8, 4) 0-(0*-1)/2,75=0
(8, 5) 1-(0*-1,75)/2,75=1
(8, 6) 0-(0*-2)/2,75=0
(8, 7) 0-(0*0)/2,75=0
(8, 8) 0-(0*0)/2,75=0
(8, 9) 0-(0*-0,25)/2,75=0
(8, 10) 0-(0*0)/2,75=0
(8, 11) 0-(0*-0,25)/2,75=0
(8, 12) 0-(0*0,25)/2,75=0
(8, 13) 0-(0*-0,75)/2,75=0
(8, 15) 0-(0*0)/2,75=0
(8, 16) 0-(0*0)/2,75=0
(8, 17) 0-(0*0)/2,75=0
(8, 18) 0-(0*0)/2,75=0
(8, 19) 1-(0*0)/2,75=1
(8, 20) 0-(0*0)/2,75=0
(8, 21) 0-(0*1,25)/2,75=0
(8, 22) 0-(0*1)/2,75=0
(8, 23) 0-(0*0)/2,75=0
(9, 0) 0-(0*0)/2,75=0
(9, 1) 0-(0*0)/2,75=0
(9, 2) 0-(0*-0,75)/2,75=0
(9, 3) 0-(0*-1)/2,75=0
(9, 4) 0-(0*-1)/2,75=0
(9, 5) 0-(0*-1,75)/2,75=0
(9, 6) 1-(0*-2)/2,75=1
(9, 7) 0-(0*0)/2,75=0
(9, 8) 0-(0*0)/2,75=0
(9, 9) 0-(0*-0,25)/2,75=0
(9, 10) 0-(0*0)/2,75=0
(9, 11) 0-(0*-0,25)/2,75=0
(9, 12) 0-(0*0,25)/2,75=0
(9, 13) 0-(0*-0,75)/2,75=0
(9, 15) 0-(0*0)/2,75=0
(9, 16) 0-(0*0)/2,75=0
(9, 17) 0-(0*0)/2,75=0
(9, 18) 0-(0*0)/2,75=0
(9, 19) 0-(0*0)/2,75=0
(9, 20) 1-(0*0)/2,75=1
(9, 21) 0-(0*1,25)/2,75=0
(9, 22) 0-(0*1)/2,75=0
(9, 23) 0-(0*0)/2,75=0
(10, 0) 0-(0*0)/2,75=0
(10, 1) 0-(0*0)/2,75=0
(10, 2) 0-(0*-0,75)/2,75=0
(10, 3) 0-(0*-1)/2,75=0
(10, 4) 0-(0*-1)/2,75=0
(10, 5) 0-(0*-1,75)/2,75=0
(10, 6) 0-(0*-2)/2,75=0
(10, 7) 1-(0*0)/2,75=1
(10, 8) 0-(0*0)/2,75=0
(10, 9) 0-(0*-0,25)/2,75=0
(10, 10) 0-(0*0)/2,75=0
(10, 11) 0-(0*-0,25)/2,75=0
(10, 12) 0-(0*0,25)/2,75=0
(10, 13) 0-(0*-0,75)/2,75=0
(10, 15) 0-(0*0)/2,75=0
(10, 16) 0-(0*0)/2,75=0
(10, 17) 0-(0*0)/2,75=0
(10, 18) 0-(0*0)/2,75=0
(10, 19) 0-(0*0)/2,75=0
(10, 20) 0-(0*0)/2,75=0
(10, 21) 1-(0*1,25)/2,75=1
(10, 22) 0-(0*1)/2,75=0
(10, 23) 0-(0*0)/2,75=0
(12, 0) 0-(0*0)/2,75=0
(12, 1) 0-(0*0)/2,75=0
(12, 2) 0-(0*-0,75)/2,75=0
(12, 3) 0-(0*-1)/2,75=0
(12, 4) 0-(0*-1)/2,75=0
(12, 5) 0-(0*-1,75)/2,75=0
(12, 6) 0-(0*-2)/2,75=0
(12, 7) 0-(0*0)/2,75=0
(12, 8) 0-(0*0)/2,75=0
(12, 9) 1-(0*-0,25)/2,75=1
(12, 10) 0-(0*0)/2,75=0
(12, 11) 0-(0*-0,25)/2,75=0
(12, 12) 0-(0*0,25)/2,75=0
(12, 13) 0-(0*-0,75)/2,75=0
(12, 15) 0-(0*0)/2,75=0
(12, 16) 0-(0*0)/2,75=0
(12, 17) 0-(0*0)/2,75=0
(12, 18) 0-(0*0)/2,75=0
(12, 19) 0-(0*0)/2,75=0
(12, 20) 0-(0*0)/2,75=0
(12, 21) 0-(0*1,25)/2,75=0
(12, 22) 0-(0*1)/2,75=0
(12, 23) 1-(0*0)/2,75=1

Просто странно, что есть "одинаковые" выражения - в одних результат нормальный, в других - нет.

Добавлено @ 22:39
З.Ы. А как подсветить выражение в коде (на форуме)? smile

Это сообщение отредактировал(а) Keeper89 - 17.3.2010, 22:41


--------------------
PM MAIL WWW   Вверх
former
Дата 18.3.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 4
Всего: 17



Keeper89, я понял. smile 
А какая точность нужна?
Как правильно заметил RomanEEP, в большинстве случаев используется округление. Или надо высчитывать погрешность вычислений.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Mikel
Дата 18.3.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: нет
Всего: 2



Я использую такое:
Код

function RoundData(v,Divider:Double):Double;
begin
  Result:=Round(V*Divider)/Divider;
end;


RoundData(v,1000); - округляет v до тысячных. Просто прикинь какая тебе точность нужна и задавай соответствующий Divider.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
cemick
Дата 18.3.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 6



Цитата(Keeper89 @  17.3.2010,  22:38 Найти цитируемый пост)
Просто странно, что есть "одинаковые" выражения - в одних результат нормальный, в других - нет.


на всякий случай http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.