Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение вещественных чисел 
:(
    Опции темы
Ander
Дата 22.11.2003, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.11.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Тут ниже приводили пример кода по сабжу. Почему получается 0.005!=0.005? Порядок хранения вещ.чисел вроде знаю, но объяснить сию ошибку не могу. Кто поможет?

#include <iostream>
#include <conio.h>
int main(int argc, char* argv[])
{
double value = 1.005 - 1.0;
if (value == double(0.005))
std::cout << value <<"== 0.005";
else
std::cout << value <<"!= 0.005";
getch();

return 0;
}

PM MAIL   Вверх
Waters
Дата 23.11.2003, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.11.2003

Репутация: нет
Всего: нет



Цитата
Почему получается 0.005!=0.005
double value = 1.005 - 1.0;
if (value == double(0.005))


Потому что слева не "точно 0.005".
Код

double value = 1.005 - 1.0;
printf("%.20lf", value);


0.00499999999999989342

Как видно, где-то после 15-ого знака начинается "шум". Это связано с ограниченной точностью представления floating-point числел.

P.S.
В вашем случае сравнивать можно так:
if(fabs(value-0.005) <= DBL_EPSILON)
{
//"равны"
}


wbr.


PM MAIL   Вверх
knave
Дата 26.11.2003, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

Репутация: 1
Всего: 5



все очень просто
для начала попробуй выведи printf-ом на value и я отвечаю что гдето вконце нулекй после запятой там будет мусор.
А мусор появлеется из-за того что происходят ошибки при вычитании чисел с плавающей запятой.

фишка в том когда из большого числа вычитаеш малое, то получится что ответ будет больше чем должен быть.

например такой пример
double a=1000000, b=0.000001;

водном случае плучится то тчо нало в другом с ошибками.
c=a+b-a;
c=b+a-b;

у тебя таже проблема


--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
Ander
Дата 26.11.2003, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.11.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Пасиба, други
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.