Здраствуйте,
Сейчас пишу программу в которой идет обработка математической ситсемы (Методом Гауса).
Может уже и поднималась такая тема, но я ее не нашел.
Вот интерестный случай и как с этим бороться.
double a=0.12;
int b = 12;
double c = a - double(b)*0.01;
Теоретически с должна быть равна 0 но на практике получается ~6E-18.
Здравствуйте, 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.
А в чем проблема то?
Типа, числа с плавающей запятой.
Алексей.
Здравствуйте, 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)
Хотел просто разобраться, правильно или нет.
Здравствуйте, 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)
{
...
}
Здравствуйте, 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>
Спасибо!!!!