точность вычислений
От: samarityanin  
Дата: 16.09.04 08:17
Оценка:

#include <math.h>

void main()
{

    double x = 0.5;
    double y = 0.05;
    double z = 0.5;
    double r = 0.05;

    double x1 = 0.5;
    double y1 = 0.15;
    double z1 = 0.5;
    double r1 = 0.05;

    double dx = x-x1;
    double dy = y-y1;
    double dz = z-z1;

    double d = sqrt(dx*dx+dy*dy+dz*dz);

    double c = r+r1 - d;
}


c = 1.3877787807814e-017 почему???

условия: AMD Athlon(TM) XP 2200+, w2k, VC++6.0
Re: точность вычислений
От: Аноним  
Дата: 16.09.04 08:23
Оценка:
S>c = 1.3877787807814e-017 почему???

Почему вы считаете, что должно быть по-другому?

--Юрий
Re: точность вычислений
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.09.04 08:26
Оценка:
Здравствуйте, 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 почему???


А почему бы и нет. Сорри, проверить не могу — калькулятор дома забыл, а корни в уме со школы не вычислял.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: точность вычислений
От: Bell Россия  
Дата: 16.09.04 08:36
Оценка:
Здравствуйте, samarityanin, Вы писали:

S>c = 1.3877787807814e-017 почему???


Не все вещественные числа могут быть представлены в двоичной системы без потери точности.
А вообще тема обсуждается очень часто — воспользуйся поиском. Для начала можно посмотреть сюда
Автор: YanMinsk
Дата: 08.12.03
Любите книгу — источник знаний (с) М.Горький
Re[2]: точность вычислений
От: Alexeib Япония  
Дата: 16.09.04 08:37
Оценка:
Здравствуйте, 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 ?
А на этот вопрос унжно искать ответ поиском
Re: точность вычислений
От: kmn Украина  
Дата: 16.09.04 08:38
Оценка:
Здравствуйте, samarityanin, Вы писали:

S>

S>#include <math.h>

S>void main()
S>{

S>    double x = 0.5;
S>    double y = 0.05;
S>    double z = 0.5;
S>    double r = 0.05;

S>    double x1 = 0.5;
S>    double y1 = 0.15;
S>    double z1 = 0.5;
S>    double r1 = 0.05;

S>    double dx = x-x1;
S>    double dy = y-y1;
S>    double dz = z-z1;

S>    double d = sqrt(dx*dx+dy*dy+dz*dz);

S>    double c = r+r1 - d;
S>}
S>


S>c = 1.3877787807814e-017 почему???

S>условия: AMD Athlon(TM) XP 2200+, w2k, VC++6.0

все правильно!!! стремится к нулю!!!
или Вы ждали "чистый" нуль?
Re: точность вычислений
От: samarityanin  
Дата: 16.09.04 08:40
Оценка:
S>

S>#include <math.h>

S>void main()
S>{

S>    double x = 0.5;
S>    double y = 0.05;
S>    double z = 0.5;
S>    double r = 0.05;

S>    double x1 = 0.5;
S>    double y1 = 0.15;
S>    double z1 = 0.5;
S>    double r1 = 0.05;

S>    double dx = x-x1;
S>    double dy = y-y1;
S>    double dz = z-z1;

S>    double d = sqrt(dx*dx+dy*dy+dz*dz);

S>    double c = r+r1 - d;
S>}
S>


S>c = 1.3877787807814e-017 почему???


S>условия: AMD Athlon(TM) XP 2200+, w2k, VC++6.0


на калькуляторе получается 0 как и должно быть,
а на компе почему-то не ноль... как с этим бороться?
Re[3]: точность вычислений
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.09.04 08:42
Оценка:
Здравствуйте, 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>А на этот вопрос унжно искать ответ поиском

А точно меня просто само число испугало .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: точность вычислений
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.09.04 08:49
Оценка: 4 (1)
Здравствуйте, 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 почему???


Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей:
1) Не все вещественные числа представимы в двоичной системе.
2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого.
3) Если нужна предельная точность, а диапозон значений не очень велик, то лучше использовать целые числа с соответствующими коэффициентами (для финансовых расчётов этот путь самый приемлемый).
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: точность вычислений
От: Adil Россия  
Дата: 16.09.04 09:03
Оценка:
Здравствуйте, Mr. None, Вы писали:
MN>2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого.
Наверно хотел сказь — не целого, а коэффициента?
MN>Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей:
Везет же людям, а комк-то пришлось на собственных шишках до этого доходить
Удачи.
Re[3]: точность вычислений
От: Анатолий Широков СССР  
Дата: 16.09.04 09:09
Оценка: 1 (1)
A>Везет же людям, а комк-то пришлось на собственных шишках до этого доходить

Есть замечательная книга: Форсайт Дж., Малькольм M., Моулер K. Машинные методы математических вычислений. — M.: Мир, 1980, 280 с.

Там отличное введение в машинные вычисления.
Re: точность вычислений
От: Kwah Голландия  
Дата: 16.09.04 09:31
Оценка: 1 (1) -1
Здравствуйте, samarityanin, Вы писали:

S>c = 1.3877787807814e-017 почему???


c = 1.3877787807814457e-017

условия: Pentium-III 800, NT WS 4.0 sp 5, VC++6.0

шютка...

нужна точность?
плевать на скорость?

boost::rational !!!
#include <cmath>
#include <iostream>
#include <iomanip>
#include <boost/rational.hpp>

typedef boost::rational<int> t_rational;

int main()
{
    t_rational x(1,2);
    t_rational y(1,20);
    t_rational z(1,2);
    t_rational r(1,20);

    t_rational x1(1,2);
    t_rational y1(3,20);
    t_rational z1(1,2);
    t_rational r1(1,20);

    t_rational dx = x-x1;
    t_rational dy = y-y1;
    t_rational dz = z-z1;

    double d = sqrt( boost::rational_cast<double>(dx*dx+dy*dy+dz*dz) );

    double c = boost::rational_cast<double>(r+r1) - d;

    std::cout << std::setprecision(32) << c << std::endl;

    return 0;
}

c = 0
Re[2]: точность вычислений
От: Anchor  
Дата: 16.09.04 10:13
Оценка:
Здравствуйте, samarityanin, Вы писали:


S>>c = 1.3877787807814e-017 почему???


S>>условия: AMD Athlon(TM) XP 2200+, w2k, VC++6.0


S>на калькуляторе получается 0 как и должно быть,

У Вас еще очень удачная ситуация. Модуль полученного числа меньше чем 0 + DBL_EPSILON, что позволяет говорить о нем как о чистом нуле.

S>а на компе почему-то не ноль... как с этим бороться?

Никогда не проверяйте вещественные числа на точное равенство, только на меньше значения плюс погрешность.
Re[3]: точность вычислений
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.09.04 10:33
Оценка:
Здравствуйте, Adil, Вы писали:

A>Здравствуйте, Mr. None, Вы писали:

MN>>2) Когда работаешь с вещественными числами надо задавать как минимум два коэффициента точностей — один для внутренних вычислений, другой для выводимых результатов. Причём первый является квадратом второго. Все хвосты, вылезающие за пределы этих коэффициентов округляются до ближайшего целого.
A>Наверно хотел сказь — не целого, а коэффициента?
Да — оговорился.

MN>>Народ учите матчасть!!! Меня преобразованиями вещественных чисел цельный семестр в универе гоняли. Даже курс так назывался — программирование вычислений, на Фортране кодили. И строгий дядя препод ходил с листочком по которому сверял результаты лабы... и не дай бог в 6-ом знаке после запятой расхождение было на единицу — отправляли на переделку. С тех пор на всю жизнь уяснил несколько вещей:

A>Везет же людям, а комк-то пришлось на собственных шишках до этого доходить
Дык мне тоже до этого пришлось самому доходить, никто мне толком ничего не объяснял, просто за моей спиной стоял препод с кнутом и листочком с правильными результатами и подгонял
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: точность вычислений
От: little_alex  
Дата: 24.09.04 17:04
Оценка:
Здравствуйте, 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].
Re: точность вычислений
От: Shhady Россия  
Дата: 24.09.04 17:54
Оценка:
Здравствуйте, samarityanin, Вы писали:

S>c = 1.3877787807814e-017 почему???


Риторический вопрос виновник: представление плавающего (даже называется соотвественно) числа на физическом уровне процессора

p.s. у меня тоже 1.3877787807814457e-017, условия: ноут p4-2.8, win xp, vc++ 7.1
... << RSDN@Home 1.1.3 stable >>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.