Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2010, 16:55   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию сложение 2 переменных типа float?

Прочитал название темы, самому стало смешно) Извините за такую "информативность".

Есть программа:

Код:
x=xmin;
		while(x<xmax){
                        //действия
			x+=0.1;
		}
Все переменные типа float

На строке x+=0.1 стоит точка остановки.
Отладчик выдаёт следующее.
1й шаг:
Код:
xmax = 5.0000000
xmin = -1.0000000
x = -1.0000000
2й шаг:
Код:
xmax = 5.0000000
xmin = -1.0000000
x = -0.89999998
Как сделать, что бы на 2м шаге х был равен -0,9?

работаю в Visual Studio 2008.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 21.06.2010, 17:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну вообще то надо знать про точность вычислений с плавающей запятой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2010, 17:24   #3
D_bl_M
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 28
По умолчанию

о чем задача собственно, напиши условие, напиши полный свой код или участок, чему равен xmin или xmax? ничего ведь непонятно, по крайней мере лично мне
D_bl_M вне форума Ответить с цитированием
Старый 21.06.2010, 17:26   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Как сделать, что бы на 2м шаге х был равен -0,9?

работаю в Visual Studio 2008.
Можете попробовать использовать double, у него повыше точность. А вообще числа с плавающей запятой не лучший выбор для точных вычислений
netrino вне форума Ответить с цитированием
Старый 21.06.2010, 22:43   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если цикл, то будет лучше xmin + i * dx, а то при добавлении большом количестве сложений ошибка накапливается. В любом случае 0.1 и подобное в двоичной системе обрезается на каком-то знаке после точки.
Somebody вне форума Ответить с цитированием
Старый 21.06.2010, 22:49   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

для Пепел Феникса:
Знать - это очень хорошо, но, к сожалению, не всегда всё знать получается, особенно если только начинаешь что-то осваивать) Если не лень, можешь пояснить? Или ссылку дать где по читать об этом? Я думал такие проблемы могут только при делении возникать..

Для D_bl_M:
В принципе, всё что нужно я написал. xmin и xmax в программе инициализируются со значениями -1 и 5 соответственно, и больше не изменяются.

Для netrino:
Спасибо, попробую. Целочисленные типы мне в данной задаче не слишком удобно использовать, но, если не получится с double, буду извращаться)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 21.06.2010, 22:54   #7
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Если цикл, то будет лучше xmin + i * dx, а то при добавлении большом количестве сложений ошибка накапливается. В любом случае 0.1 и подобное в двоичной системе обрезается на каком-то знаке после точки.
Somebody, а i здесь что? Целочисленная переменная?
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 22.06.2010, 10:55   #8
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Всем спасибо. Сначала сделал как предлагал Somebody, потом перевёл всё в double, как советовал netrino. Точности double для моей задачи хватило.

Действительно,
Цитата:
Сообщение от netrino Посмотреть сообщение
числа с плавающей запятой не лучший выбор для точных вычислений
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FLOAT TO TRING И STRING TO FLOAT!! MelKiY_bad C++ Builder 6 07.05.2010 14:31
Аналог функции rand() для типа float Linel PHP 1 01.06.2009 21:01
сортировка чисел типа float дядя Общие вопросы C/C++ 2 23.05.2009 12:11
Точность типа float HunterMan Общие вопросы C/C++ 6 07.02.2009 23:05