Помогите мат. вычиления
От: Aloner  
Дата: 23.06.04 10:43
Оценка:
Здраствуйте,

Сейчас пишу программу в которой идет обработка математической ситсемы (Методом Гауса).

Может уже и поднималась такая тема, но я ее не нашел.

Вот интерестный случай и как с этим бороться.

double a=0.12;
int b = 12;
double c = a - double(b)*0.01;


Теоретически с должна быть равна 0 но на практике получается ~6E-18.
Re: Помогите мат. вычиления
От: AMogil Россия  
Дата: 23.06.04 11:04
Оценка:
Здравствуйте, Aloner, Вы писали:

A>Здраствуйте,


A>Сейчас пишу программу в которой идет обработка математической ситсемы (Методом Гауса).


A>Может уже и поднималась такая тема, но я ее не нашел.


A>Вот интерестный случай и как с этим бороться.


A>
A>double a=0.12;
A>int b = 12;
A>double c = a - double(b)*0.01;
A>


A>Теоретически с должна быть равна 0 но на практике получается ~6E-18.


А в чем проблема то?
Типа, числа с плавающей запятой.

Алексей.
Re[2]: Помогите мат. вычиления
От: Aloner  
Дата: 23.06.04 11:42
Оценка:
Здравствуйте, AMogil, Вы писали:

AM>Здравствуйте, Aloner, Вы писали:


A>>Здраствуйте,


A>>Сейчас пишу программу в которой идет обработка математической ситсемы (Методом Гауса).


A>>Может уже и поднималась такая тема, но я ее не нашел.


A>>Вот интерестный случай и как с этим бороться.


A>>
A>>double a=0.12;
A>>int b = 12;
A>>double c = a - double(b)*0.01;
A>>


A>>Теоретически с должна быть равна 0 но на практике получается ~6E-18.


AM>А в чем проблема то?

AM>Типа, числа с плавающей запятой.

AM>Алексей.


не совсем проблема, неприятность скорей.

У меня есть SCROLLBAR при помощи которого выберается нужные значения и массива.

МАССИВ double [ТОК][ТЕМПЕРАТУА]

Стравнивается ТОК с SCROLLBAR->POSITION * 0.01 вот и получается что например:

SCROLLBAR->POSITION = 3
ТОК = 0.03

и условие (ТОК == SCROLLBAR->POSITION * 0.01) несправедливо.
вышел из ситуации след. образом.

if (fabs(ТОК — double(SCROLLBAR->POSITION) * 0.01)<0.001)


Хотел просто разобраться, правильно или нет.
Re[3]: Помогите мат. вычиления
От: Vorobiev Sergei Россия  
Дата: 23.06.04 11:56
Оценка: +1
Здравствуйте, Aloner, Вы писали:

A>и условие (ТОК == SCROLLBAR->POSITION * 0.01) несправедливо.

A>вышел из ситуации след. образом.

A>if (fabs(ТОК — double(SCROLLBAR->POSITION) * 0.01)<0.001)


A>Хотел просто разобраться, правильно или нет.


Правильно. Числа с плавающей точкой можно сравнивать только в эпсилон окрестности. Т.к. при вычислениях возникает погрешность, из-за того что кол-во знаков после запятой ограничено.
Лучше делать так.

#include <float.h>
...
if (fabs(ТОК - double(SCROLLBAR->POSITION) * 0.01) < DBL_EPSILON)
{
...
}
Re[4]: Помогите мат. вычиления
От: Аноним  
Дата: 24.06.04 17:10
Оценка:
Здравствуйте, Vorobiev Sergei, Вы писали:

VS>Здравствуйте, Aloner, Вы писали:


A>>и условие (ТОК == SCROLLBAR->POSITION * 0.01) несправедливо.

A>>вышел из ситуации след. образом.

A>>if (fabs(ТОК — double(SCROLLBAR->POSITION) * 0.01)<0.001)


A>>Хотел просто разобраться, правильно или нет.


VS>Правильно. Числа с плавающей точкой можно сравнивать только в эпсилон окрестности. Т.к. при вычислениях возникает погрешность, из-за того что кол-во знаков после запятой ограничено.

VS>Лучше делать так.

VS>
VS>#include <float.h>
VS>...
VS>if (fabs(ТОК - double(SCROLLBAR->POSITION) * 0.01) < DBL_EPSILON)
VS>{
VS>...
VS>}
VS>


Спасибо!!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.