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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 111
#1

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

11.06.2013, 23:20. Просмотров 933. Ответов 12
Метки нет (Все метки)

Кто сталкивался с таким глюком, почему если я задаю
C++
1
double x=0.1;
в дебаггере я его вижу как 0.10000000000000001 ?
я знал что float неточные числа, но что double...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Число double 0.1 на самом деле не 0.1 (C++):

На самом деле #define'а нету. - C++
На самом деле #define нету. Вот например если мы напишем в c++ #define yes 1 #define no 0 то на самом деле мы получим int yes=1; ...

что же на самом деле делает strcpy? - C++
вот такой пример #include <iostream> #include <string> using namespace std; int main () { string buff; buff += "what a...

ошибки которых на самом деле нет - C++
possible use of идентификатор before diffinotion(С++) у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены...

Что такое string на самом деле? - C++
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне необходимо из строки string str получить unsignet char* для...

Что такое ссылка на самом деле? - C++
Здравствуйте. Насколько я понимаю, ссылка - это переменная, которая на самом деле является указателем на адрес другой переменной, но с...

Передача массива в функцию - что на самом деле предается? - C++
Имя массива это константный указатель. Когда мы передаем его в функциюvoid f1(int *iArray) f1 это происходит как pass by reference. В...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
11.06.2013, 23:32 #2
переменная double имеет двойную точность
Двойная точность
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 111
11.06.2013, 23:35  [ТС] #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 #4
а для чего нужен такой цикл?
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,523
11.06.2013, 23:37 #5
недавно подробно обсуждали этот вопрос, он не относиться к определенному языку программирования
От перемены мест слагаемых сумма меняется
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 111
11.06.2013, 23:37  [ТС] #6
Цитата Сообщение от Мимино Посмотреть сообщение
а для чего нужен такой цикл?
там же где и всегда - в институте на лабах))))))
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
11.06.2013, 23:41 #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
Сообщений: 111
11.06.2013, 23:42  [ТС] #8
Цитата Сообщение от Мимино Посмотреть сообщение
Замените на
C++
1
2
3
4
5
for (int i = 0; i < 14; i++){
   if (i == 10) {
       ///что нибудь
   }
}
именно таким же способом я и выкрутился
зато теперь буду знать что нельзя сравнивать (на тождество) числа с плавающей запятой
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,523
11.06.2013, 23:43 #9
если вы ещё не почитали мою ссылку то ключевая фраза там

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

if (a == b) then ...

-- писать

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

Оператор \ выражение - что же это такое на самом деле? - C++
Какого ... выражение называют оператором?

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Вывести long double число без перевода в double - C++
Надо вывести long double число без перевода в double. Пишу: printf(&quot;%Lf&quot;,S); и выводится неверно. Компилятор -- MinGW, та же фишка на...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.06.2013, 00:46
Ответ Создать тему
Опции темы

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