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

Число double 0.1 на самом деле не 0.1 - C++

Восстановить пароль Регистрация
 
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
11.06.2013, 23:20     Число double 0.1 на самом деле не 0.1 #1
Кто сталкивался с таким глюком, почему если я задаю
C++
1
double x=0.1;
в дебаггере я его вижу как 0.10000000000000001 ?
я знал что float неточные числа, но что double...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
11.06.2013, 23:32     Число double 0.1 на самом деле не 0.1 #2
переменная double имеет двойную точность
Двойная точность
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
11.06.2013, 23:35  [ТС]     Число double 0.1 на самом деле не 0.1 #3
а ещё точнее числа есть?
мне не столько офигенная точность нужна, сколько при цикле типа
C++
1
2
3
4
5
for (double i=1.0;i<2.4;i+=0.1){
   if (i==2.0) {
       ///что нибудь
   }
}
это что нибудь - никогда не произойдет
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
11.06.2013, 23:36     Число double 0.1 на самом деле не 0.1 #4
а для чего нужен такой цикл?
XRuZzz
Антикодер
603 / 504 / 25
Регистрация: 15.09.2012
Сообщений: 2,450
11.06.2013, 23:37     Число double 0.1 на самом деле не 0.1 #5
недавно подробно обсуждали этот вопрос, он не относиться к определенному языку программирования
От перемены мест слагаемых сумма меняется
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
11.06.2013, 23:37  [ТС]     Число double 0.1 на самом деле не 0.1 #6
Цитата Сообщение от Мимино Посмотреть сообщение
а для чего нужен такой цикл?
там же где и всегда - в институте на лабах))))))
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
11.06.2013, 23:41     Число double 0.1 на самом деле не 0.1 #7
Цитата Сообщение от RimoBlack Посмотреть сообщение
там же где и всегда - в институте на лабах))))))
Замените на
C++
1
2
3
4
5
for (int i = 0; i < 14; i++){
   if (i == 10) {
       ///что нибудь
   }
}
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
11.06.2013, 23:42  [ТС]     Число double 0.1 на самом деле не 0.1 #8
Цитата Сообщение от Мимино Посмотреть сообщение
Замените на
C++
1
2
3
4
5
for (int i = 0; i < 14; i++){
   if (i == 10) {
       ///что нибудь
   }
}
именно таким же способом я и выкрутился
зато теперь буду знать что нельзя сравнивать (на тождество) числа с плавающей запятой
XRuZzz
Антикодер
603 / 504 / 25
Регистрация: 15.09.2012
Сообщений: 2,450
11.06.2013, 23:43     Число double 0.1 на самом деле не 0.1 #9
если вы ещё не почитали мою ссылку то ключевая фраза там

-- вместо этого:

if (a == b) then ...

-- писать

if (abs (a-b)) < 1.0E-8 then ...
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
11.06.2013, 23:46     Число double 0.1 на самом деле не 0.1 #10
Вся причина в представлении чисел с плавающей точкой.Дело в том,что в число с плавающей точкой как бы разбивается на два ,целую и дробную и представляется в экспоненциальном веде т.е целое число * 10 - какой то степени.И поэтому 0 вовсе и не 0,а какое то очень маленькое число.Помогает округление до нужного знака.Округлять можно по разному.Я пользуюсь либо модификатором
C++
1
setprecision(3)
в потоке вывода либо
C++
1
 floor (s + 0.5 / 1000)*1000;
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
11.06.2013, 23:50  [ТС]     Число double 0.1 на самом деле не 0.1 #11
Цитата Сообщение от XRuZzz Посмотреть сообщение
если вы ещё не почитали мою ссылку то ключевая фраза там
читал, и вспомнил что что-то похоже я уже делал, когда нужно было найти сумму ряда до определенного знака, но вспомнил только когда открыл ссылку
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
12.06.2013, 00:45     Число double 0.1 на самом деле не 0.1 #12
RimoBlack, почитайте про представление вещественных чисел в компьютере, а также погрешности вычислений, округлений (их виды и т.д.).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 00:46     Число double 0.1 на самом деле не 0.1
Еще ссылки по теме:

C++ double число
C++ Передача массива в функцию - что на самом деле предается?
что же на самом деле делает strcpy? C++
C++ Что такое string на самом деле?
Оператор \ выражение - что же это такое на самом деле? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
12.06.2013, 00:46  [ТС]     Число double 0.1 на самом деле не 0.1 #13
Цитата Сообщение от BumerangSP Посмотреть сообщение
RimoBlack, почитайте про представление вещественных чисел в компьютере, а также погрешность вычислений (их виды и т.д.).
Спасибо, теорию я знаю, но вспоминаю я её только когда в тупик захожу. Как никак 6 курс уже, позабывал уже многое...
Yandex
Объявления
12.06.2013, 00:46     Число double 0.1 на самом деле не 0.1
Ответ Создать тему
Опции темы

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