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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
#1

double и for - C++

28.07.2011, 16:42. Просмотров 1443. Ответов 30
Метки нет (Все метки)

Здравствуйте, объясните пожалуйста почему в операции:
C++
1
for (double y = .1; y != 1.0; y += .1)
получается бесконечный цикл, то есть проскакивает выражение 1.0 == 1.0 - как true

ps я знаю что не корректно использоваться не целочисленный "счетчик", но терзает любопытство почему...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2011, 16:42     double и for
Посмотрите здесь:

typedef double (*d)(double); - C++
//--------------------------------------------------------------------------- #include "math.h" #include <stdio.h> #include...

Перевод double to double - C++
Всем привет! проблема такая : Есть вектор типа double. Из него надо считать число в переменную, которая тоже имеет тип double. Считываю...

Double - C++
чтото тут не так, не выдает ошибку но пишет -175756757567657 вот код double z; z=10,3; printf("%d", z); делаю по...

double - C++
Если преобразовать double к char*, то какие байты будут отвечать за целую часть, а какие за дробную?

double - C++
double s = (1 / 5); cout << s; в моём понимании он должен вывести 0.2 ну или что-то типо того. Но выводит 0... Чё то я не понимаю...

Преобразование к double - C++
Есть переменная типа Timestamp. Timestamp определен как структура: struct Timestamp { unsigned int seconds :32; unsigned...

double + cout - C++
Через cout вывожу double. double a = 48.799999999999997; cout << a; Выводит: 48.8. Как сделать, что бы не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.07.2011, 16:44     double и for #2
List2006, Архитектура. Где-то на форуме обсуждалось.
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 16:50  [ТС]     double и for #3
Цитата Сообщение от ForEveR Посмотреть сообщение
...Где-то...
уж лучше бы ты меня в гугль отправил , а по конкретнее можно где именно это было?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
28.07.2011, 16:55     double и for #4
Из-за неточности вещественных чисел.
Для примера - посмотрите результат 10./3*3.
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 16:59  [ТС]     double и for #5
Цитата Сообщение от diagon Посмотреть сообщение
Из-за неточности вещественных чисел.
Для примера - посмотрите результат 10./3*3.
я это понимаю, но в данном случае же не использовалось деление,
а нули позади числа не имеет значения (как гласит нам математика):
1.0 тоже что и 1.000000000000000000

тут можно сделать вывод что С++ заведома делает число не правильным, дописывая скажем
в 1.0 - 1.00000000000000000001 ?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
28.07.2011, 17:06     double и for #6
Можно погуглить.
Ну или скомпилить этот код
C++
1
2
3
4
5
6
7
#include <iostream>
#include <iomanip>
int main(){
    double y = 0.1;
    for (; y < 1.0; y += .1);
    std::cout << std::fixed << std::setprecision(16) << y - 1.1;
}
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 17:09     double и for #7
Потому как 0.1 в двоичной системе счисления - это бесконечная периодическая дробь.
Естественно, при представлении в машине она отсекается-округляется...
Таким образом 10*0.1 != 1.0 для дробных чисел
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 17:47  [ТС]     double и for #8
если удлинить выдачу разрядов
std::setprecision(80)

то видно что после 16 добавляются какие то шумы и добавляются они тоже ограниченно (то есть потом идут "нечто" - нули) и для одного и того же значения, скажем "y = .1" - шумы будут постоянны.
Но, если после запятой значение "0", скажем "1.0" то шумы не добавляются.

Отсюда вывод: получается что С++ заведомо добавляет эти шумы чтобы достичь свойств вещественных чисел (то есть это по-моему не прихоть железа, а прихоть потребности сделать не точно).

PS либо шумы это глюк объекта cout.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.07.2011, 17:50     double и for #9
Цитата Сообщение от List2006 Посмотреть сообщение
если удлинить выдачу разрядов
std::setprecision(80)
Где же Вы столько разрядов в double возьмете? Оо
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 17:55  [ТС]     double и for #10
даже при деление "1.0/10.0" - шумы точно такие же как, как если бы была просто константа "0.1".
Напомню что для 1.0 и 10.0 шумов нет.

Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
Где же Вы столько разрядов в double возьмете? Оо
их нет, но видимо для вычислений они прикручиваются, или опять же говорю глюк cout.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 18:05     double и for #11
List2006, какие шумы?!!!!
Фокус в том, что для ВСЕХ дробных чисел, кроме степеней двойки (которые представляются ТОЧНО) при переводе в двоичную систему получите бесконечную дробь. Это математика, а не "шумы"...
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 18:19  [ТС]     double и for #12
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
List2006, какие шумы?!!!!
Фокус в том, что для ВСЕХ дробных чисел, кроме степеней двойки (которые представляются ТОЧНО) при переводе в двоичную систему получите бесконечную дробь. Это математика, а не "шумы"...
Какая блин математика, ты код скомпилируй как я тебе говорил с 80 разрядами.
Вот результаты для констант (и где там твоя теория с двойкой??):
0.1 = 0.10000000000000000555111512312578270211815834045410156250000000000000000000000000
0.2 = 0.20000000000000001110223024625156540423631668090820312500000000000000000000000000
0.3 = 0.29999999999999998889776975374843459576368331909179687500000000000000000000000000
0.1 = 0.10000000000000000555111512312578270211815834045410156250000000000000000000000000

0.1 / 2.0 = 0.05000000000000000277555756156289135105907917022705078125000000000000000000000000

сам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main (int argc, char** argv)
{
        std::cout << std::fixed << std::setprecision(80) 
        << "\n0.1 = " << 0.1
        << "\n0.2 = " << 0.2
        << "\n0.3 = " << 0.3
        << "\n0.1 = " << 0.1
        << "\n0.1 / 2.0 = " << 0.1 / 2.0;
 
    std::cin.get();
    return 0;
}
ps оформление, подключенные библиотеки - это у меня для тестов, я просто скопировал все.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.07.2011, 18:26     double и for #13
List2006, шумы в голове у Вас, реальных разрядов здесь около 15-16, все остальное мусор, который не относится к числу.

Не по теме:

Надо же так додуматься, и смех и грех

List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 18:28  [ТС]     double и for #14
это не завесит от памяти, времени, эти шумы постоянны для значений за нулём.
К сожалению не могу попробовать на другом компиляторе (у меня MinGW).

PS какая математика, когда представление в памяти идет не в математических дробях, а банально в битах, где после 16 бит нечего нет. Я не думаю чтобы представить константу компилятор заставляет вычислить её (ему придется каждый раз подбирать для этого значение дроби).

Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
List2006, шумы в голове у Вас, реальных разрядов здесь около 15-16, все остальное мусор, который не относится к числу.

Не по теме:

Надо же так додуматься, и смех и грех

да я уже и без вас это сказал, факт что числа для константы и для выражении постоянны, не зависят от времени, памяти, и расположение памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2011, 18:31     double и for
Еще ссылки по теме:

модуль от double? - C++
дано три целых числа (integer). найти а. это ошибка в самом условии, или есть функция, находящая модуль дробного числа? abs не...

Long Double - C++
Разве нет типа более емкого, чем Double в Visual studio? Long Double, как я понял, определяется как обычный Double. А мне нужен аналог по...

Random for double:( - C++
Задание: Создать функцию random(a, b), которая возвращает случайное вещественное число от вещественного числа a включительно до...

Округление double - C++
Короче ввожу число 1.05 в Debug показывает его, как 1.004999999999999999995663191310058 вот как эту чушь убрать, у меня задача из-за...

scanf for double - C++
Не подскажите как будет выглядеть функция scanf если нужно считать double Заранее спасибо


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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.07.2011, 18:31     double и for #15
Цитата Сообщение от List2006 Посмотреть сообщение
Я не думаю чтобы представить константу компилятор заставляет вычислить её (ему придется каждый раз подбирать для этого значение дроби).
А как еще-то? Просто вычислить придеться всего один раз. А уж при выводе точно каждый раз пересчет идет.
Yandex
Объявления
28.07.2011, 18:31     double и for
Ответ Создать тему
Опции темы

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