Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 01.10.2013, 21:16   #1
lalka
Новичок
 
Регистрация: 01.10.2013
Сообщений: 2
Репутация: 10
По умолчанию Оператор 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,957
Репутация: 6832
По умолчанию

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

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

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

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

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

Цитата:
Сообщение от 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
Профессионал
 
Регистрация: 02.01.2011
Сообщений: 3,260
Репутация: 915
По умолчанию

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

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

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

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

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

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

вещественный числа вообще нельзя никогда сравнивать на равенство оператором == (а также <=, >=).
Вещественные числа всегда сравниваются с какой-то погрешностью.
Ну или вотъ: 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
Адрес: Димитровград
Сообщений: 544
Репутация: 111

skype: ilya10009
По умолчанию

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

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

Да про что тут писать то?
Если уж очень хочется почитать, ищи в книжках по теории автоматов (вроде бы в етих разделах описываются разные варианты хранения чисел в ЭВМ).
Вот другой пример: 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


23:09.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru