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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2013, 21:16   #1
lalka
Новичок
Джуниор
 
Регистрация: 01.10.2013
Сообщений: 2
По умолчанию Оператор for

Есть такой код:
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale>
int main()
{
setlocale (LC_ALL, "Russian");
float y,x;

for (x=0;x<=1.5;x=x+0.1)
{
y=(cos(x)*cos(x)-sin(x+0.5)-x*x*x)/(x+1) + sqrt(cos(x)/(x*x+0.1));
printf("y=%4.1f при x= %.1f \n", y, x);
}
getch();
}
почему не выводится значение у при х=1.5, нужно что бы работало именно с условием x<=1.5 а не x<1.6. Объясните пожалуйста в чем проблема.

Последний раз редактировалось Stilet; 01.10.2013 в 21:36.
lalka вне форума Ответить с цитированием
Старый 01.10.2013, 21:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а не x<1.6.
А почему, если не секрет?

P.S. А интересно почему действительно <= не срабатывает на равенство. Неужели из-за костылей проца при работе с вещественными?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.10.2013, 22:23   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Неужели из-за костылей проца при работе с вещественными?
имхо, 99.99% именно в этом!

см. пост (особенно статью Антона Григорьева рекомендую...)

Не знаю, конечно, как там в C, но, думаю, что общая логика машинного представления вещественных чисел одинакова хоть для Delphi, хоть для C!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.10.2013, 22:31   #4
lalka
Новичок
Джуниор
 
Регистрация: 01.10.2013
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему, если не секрет?

P.S. А интересно почему действительно <= не срабатывает на равенство. Неужели из-за костылей проца при работе с вещественными?
Ну такое условие поставлено. И прикол в том, что при x<=0.5 подсчитывается и выводится у.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
имхо, 99.99% именно в этом!

см. пост (особенно статью Антона Григорьева рекомендую...)

Не знаю, конечно, как там в C, но, думаю, что общая логика машинного представления вещественных чисел одинакова хоть для Delphi, хоть для C!
Спасибо, статья помогла понять в чем проблема.

Последний раз редактировалось Stilet; 02.10.2013 в 09:36.
lalka вне форума Ответить с цитированием
Старый 01.10.2013, 23:56   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

А я не могу прочитать статью. Пишет, что "404 - Компонент не найден"

Про "Загадки округления" интересно написано. Нужно будет прочитать. Спасибо за ссылку!

Последний раз редактировалось 8Observer8; 01.10.2013 в 23:59.
8Observer8 вне форума Ответить с цитированием
Старый 02.10.2013, 08:48   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ваша правда. умерла ссылочка...

но статью легко найти поиском.

Более того, доступен оригинал статьи на сайте королевства Дельфи:
Антон Григорьев. "Неочевидные особенности вещественных чисел"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.10.2013, 12:17   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

вещественный числа вообще нельзя никогда сравнивать на равенство оператором == (а также <=, >=).
Вещественные числа всегда сравниваются с какой-то погрешностью.
Ну или вотъ: http://www.cplusplus.com/reference/cmath/islessequal/
но я этой штукой ниразу не пользовался, и не знаю как оно работает )
Там есть примечание:
Цитата:
In C++, it is implemented with function overloads for each floating-point type, each returning a bool value.
rrrFer вне форума Ответить с цитированием
Старый 02.10.2013, 13:50   #8
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Почему то в литературе особо акцент на ото не делается. Была подобная проблема ни один день на это убил. Кто же знал что float нельзя сравнить с абсолютной точностью.
Пришлось использовать int а в теле цикла привел к float и умножил на нужный коэффициент.
SAMOUCHKA вне форума Ответить с цитированием
Старый 02.10.2013, 15:09   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Почему то в литературе особо акцент на ото не делается.
Ну... Как-то не пришлась эта проблема по вкусу авторам.
Да и если честно она не такая уж и назойливая, т.е. она есть но ее в 100% случаев можно обойти описав код по другому.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.10.2013, 19:38   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Да про что тут писать то?
Если уж очень хочется почитать, ищи в книжках по теории автоматов (вроде бы в етих разделах описываются разные варианты хранения чисел в ЭВМ).
Вот другой пример: http://ideone.com/PRnt8Y
Код:
#include <iostream>

int main() {
  std::cout.precision(25);
  std::cout << std::fixed << 1e-10 << std::endl;
  std::cout << std::fixed << 1 + 1e-10 << std::endl;
  std::cout << std::fixed << 10 + 1e-10 << std::endl;
  std::cout << std::fixed << 100 + 1e-10 << std::endl;
  std::cout << std::fixed << 10e10 + 1e-10 << std::endl;
}
Проблема всплывает чуть чаще чем постоянно, вцелом. Потому что надо бить по рукам пока студенты еще маленькие ).
Ошибки по типу той, что у ТС хрен выловишь. У меня такие проблемы возникали при работе с графическими сценами (потому что всякие опенглы хранят координаты объектов в дробных числах) и когда ты захочешь узнать лежат ли 2 объекта друг под другом начинаешь использовать всякие штуки типы qFuzzyCompare (если бы проблемы можно было всегда избежать - таких костылей бы не существовало впринципе).
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условный оператор,оператор цикла и массив Klark73 Microsoft Office Excel 1 19.12.2011 17:09
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
Условный оператор. Оператор выбора. Pascal Сержuk Помощь студентам 4 17.11.2010 12:50
Вычислить используя, оператор цикла for и оператор безусловного пе Knubbe Помощь студентам 1 18.12.2009 10:24