Авторизация



Счетчики

Обмен ссылками

Блог программиста
Главная Форум Вычисления в ВС++ 3.1
 Форум
Добро пожаловать Гость   [Зарегистрироваться]  Войти
Ответить
 Тема :Вычисления в ВС++ 3.1.. 21-10-2010 23:49:22 
sergik_n
Hello, world!
Онлайн с: 21-10-2010 19:16:24
Сообщения: 1
Среда обитания
Здравствуйте!
Имеется фрагмент программы в котором вычисляется количество
проходов цикла от x0 до x1 с шагом dx:
#include
#include
void main()
{
float x0, x1, dx;
int n;
x0=-2.;
x1=2.;
dx=0.2;
n=floor(fabs((x1-x0)/dx));
printf ("n=%d\n",n);
}
При данных значениях должны получить 4/0,2 = 20.
Но из-за представления 0,2 в двоичной системе получаем погрешность
вычислений и результатом (в Borland C++ 3.1) будет 19!
Проблему решает описание переменных как double,
но интересно как такие вычисления (с погрешностями) решать правильно.

Оффтоп: я не смог зарегистрироваться со стартовой странички форума,
а только с главной странички ))
IP сохранен
Цитировать
 Тема :Re:Вычисления в ВС++ 3.1.. 25-10-2010 13:14:01 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
На самом деле погрешность будет всегда, хоть это будет float, хоть double. Просто у double погрешность меньше, т.к. выше точность, поэтому, видимо, так удачно округлилось.
В вашем случае, думаю, можно написать свою функцию округления до ближайшего целого. К примеру, такую:
Code:
int Round(double x) //Округление до ближайшего целого { if (x - floor(x) < 0.5) return floor(x); //Округление с недостатком return ceil(x); //Округление с избытком }
А в серьезных математических пакетах проблемы с точностью, насколько я знаю, решают рядом способов, в числе которых длинная арифметика и создание типа "рациональная дробь" с определением для него всех необходимых операций.
IP сохранен
Цитировать
Ответить
Страница # 


Powered by ccBoard