Форум программистов, компьютерный форум CyberForum.ru

Почти ноль - не устраивает - C++

Восстановить пароль Регистрация
 
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
14.02.2012, 19:38     Почти ноль - не устраивает #1
Подскажите кто знает , вот примерчик :
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
double val = -1.0;
while(val < 1.0){
val += 0.1;
std::cout << "\t\t"<< val << std::endl;
}
return 0;
}
А вот результат :
Почему: -138778e - 016 ? Почти ноль ,но не ноль.
Миниатюры
Почти ноль - не устраивает  
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.02.2012, 19:49     Почти ноль - не устраивает #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
 
int main()
{
    double val; 
    val = -1.0;
    while(val < 1.0)
    {
        val += 0.1;
        std::cout << std::fixed << std::setprecision(1) << val << std::endl;
    }
    system("pause >> null");
    return 0;
}
Миниатюры
Почти ноль - не устраивает  
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
14.02.2012, 19:55  [ТС]     Почти ноль - не устраивает #3
Infinity3000, понятно что можно обрезать .Как объяснить
что результат не равен : 0
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.02.2012, 19:58     Почти ноль - не устраивает #4
Цитата Сообщение от MrCold Посмотреть сообщение
что результат не равен - 0
Я думаю потому что тип double имеет формат 0.0 ! а когда -0.1 + 0.1 = 0, следовательно не подходит формат записи!)))))))))))
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.02.2012, 11:29     Почти ноль - не устраивает #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
MrCold, всё дело в ошибке округления. Тип double не может с бесконечной точностью представлять числа, иногда приходится отбрасывать разряды, которые он не может уместить. Отсюда и проблема. Вообще, две переменные типа double даже сравнивать принято не так
C++
1
if (dbl1 == dbl2)
, а, например, так
C++
1
if (fabs(dbl1 - dbl2) < 1e-8)
, поскольку в первом случае числа могут (с определённой точностью) быть равными, но, тем не менее, воспримутся как различные (например, в вашем примере сравнение с нулём ни разу не даст истину, хотя один раз число на самом деле является нулём).
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,989
15.02.2012, 12:26     Почти ноль - не устраивает #6
MrCold, В 2-ичной системе счисления o.1 - бесконечная периодическая дробь. Пока наши компутеры, сколь они не мощны, с бесконечностью не справляются
Вот если б ты взял 0.125 вместо 0.1, может быть чего-то и вышло
Yandex
Объявления
15.02.2012, 12:26     Почти ноль - не устраивает
Ответ Создать тему
Опции темы

Текущее время: 20:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru