Здравствуйте, samarityanin, Вы писали:
S>c = 1.3877787807814e-017 почему???
Не все вещественные числа могут быть представлены в двоичной системы без потери точности.
А вообще тема обсуждается очень часто — воспользуйся поиском. Для начала можно посмотреть сюда
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, samarityanin, Вы писали:
S>>
S>>#include <math.h>
S>>void main()
S>>{
S>> double d = sqrt(dx*dx+dy*dy+dz*dz);
S>> double c = r+r1 - d;
S>>}
S>>
S>>c = 1.3877787807814e-017 почему???
MN>А почему бы и нет. Сорри, проверить не могу — калькулятор дома забыл, а корни в уме со школы не вычислял.
Какие корни? Если посмотрите на начальные условия, то ясно что samarityanin подразумевал почему 0.05+0.05- sqrt(0.1*0.1) != 0 ?
А на этот вопрос унжно искать ответ поиском
Здравствуйте, Alexeib, Вы писали:
A>Здравствуйте, Mr. None, Вы писали:
MN>>Здравствуйте, samarityanin, Вы писали:
S>>>c = 1.3877787807814e-017 почему???
MN>>А почему бы и нет. Сорри, проверить не могу — калькулятор дома забыл, а корни в уме со школы не вычислял.
A>Какие корни? Если посмотрите на начальные условия, то ясно что samarityanin подразумевал почему 0.05+0.05- sqrt(0.1*0.1) != 0 ? A>А на этот вопрос унжно искать ответ поиском
А точно меня просто само число испугало .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
S>#include <math.h>
S>void main()
S>{
S> double d = sqrt(dx*dx+dy*dy+dz*dz);
S> double c = r+r1 - d;
S>}
S>
S>c = 1.3877787807814e-017 почему???
Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей:
1) Не все вещественные числа представимы в двоичной системе.
2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого.
3) Если нужна предельная точность, а диапозон значений не очень велик, то лучше использовать целые числа с соответствующими коэффициентами (для финансовых расчётов этот путь самый приемлемый).
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Mr. None, Вы писали: MN>2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого.
Наверно хотел сказь — не целого, а коэффициента? MN>Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей:
Везет же людям, а комк-то пришлось на собственных шишках до этого доходить
S>>c = 1.3877787807814e-017 почему???
S>>условия: AMD Athlon(TM) XP 2200+, w2k, VC++6.0
S>на калькуляторе получается 0 как и должно быть,
У Вас еще очень удачная ситуация. Модуль полученного числа меньше чем 0 + DBL_EPSILON, что позволяет говорить о нем как о чистом нуле.
S>а на компе почему-то не ноль... как с этим бороться?
Никогда не проверяйте вещественные числа на точное равенство, только на меньше значения плюс погрешность.
Здравствуйте, Adil, Вы писали:
A>Здравствуйте, Mr. None, Вы писали: MN>>2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого. A>Наверно хотел сказь — не целого, а коэффициента?
Да — оговорился.
MN>>Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей: A>Везет же людям, а комк-то пришлось на собственных шишках до этого доходить
Дык мне тоже до этого пришлось самому доходить, никто мне толком ничего не объяснял, просто за моей спиной стоял препод с кнутом и листочком с правильными результатами и подгонял
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Kwah, Вы писали:
K> double d = sqrt( boost::rational_cast<double>(dx*dx+dy*dy+dz*dz) );
K> double c = boost::rational_cast<double>(r+r1) — d;
И что все равно std::sqrt встроенное.откуда точность?если и использовать rational то или не использовать sqrt(возвести все в квадрат) или использовать реализацию основанную на rational типа sin(x)=x-x*x*x/3!+....
Повезло просто что ноль вышел
ИМХО здесь подошел бы boost::interval — сказал бы sqrt(x)=[a-eps;a+eps].