![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Ander |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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; } |
|||
|
||||
| Waters |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.11.2003 Репутация: нет Всего: нет |
Потому что слева не "точно 0.005".
0.00499999999999989342 Как видно, где-то после 15-ого знака начинается "шум". Это связано с ограниченной точностью представления floating-point числел. P.S. В вашем случае сравнивать можно так: if(fabs(value-0.005) <= DBL_EPSILON) { //"равны" } wbr. |
||||
|
|||||
| knave |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 6.3.2003 Где: Санкт-Питербург ( Россия) Репутация: 1 Всего: 5 |
все очень просто
для начала попробуй выведи printf-ом на value и я отвечаю что гдето вконце нулекй после запятой там будет мусор. А мусор появлеется из-за того что происходят ошибки при вычитании чисел с плавающей запятой. фишка в том когда из большого числа вычитаеш малое, то получится что ответ будет больше чем должен быть. например такой пример double a=1000000, b=0.000001; водном случае плучится то тчо нало в другом с ошибками. c=a+b-a; c=b+a-b; у тебя таже проблема -------------------- С наилучшими пожеланиями !!! |
|||
|
||||
| Ander |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 17.11.2003 Где: Рига, Латвия Репутация: нет Всего: 1 |
Пасиба, други
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |