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

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

Войти
Регистрация
Восстановить пароль
 
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
#1

ошибка в коде - C++

28.05.2012, 22:16. Просмотров 349. Ответов 6
Метки нет (Все метки)

День добрый. Есть код (не рабочий):
C++
1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
 
int main()
{
  float n=0.5;
  cout<<((n-2.0)*(n<2.0))<0.1;  // не поставил ( )
}
Dev-C++ выдает в сообщении об ошибке:
C++
1
((((double)n) - 2.0e+0) * 0.0)))) < 1.00000000000000005551115123125782702118158340454e-1
онлайн компиляторы выдают:
C++
1
2
3
4
5
//только один написал:
(((((double)n) - 2.0e+0) * ((n < 2.0e+0f) ? 1.0e+0 : 0.0))) < 1.0000000000000001e-1
 
//в остальных случаях:
(((((double)n) - 2.0e+0) * ((n < 2.0e+0f) ? 1.0e+0 : 0.0))) < 1.00000000000000005551115123125782702118158340454e-1
Вопрос: Зачем компилятор так преобразует выражение? Почему "мусор" в дроби числа 0.1 одинаков при обработке разными компиляторами? (я думал мусор там рандомен и будет отличаться на "разных" компах).
Извиняйте, если не правильно поставил вопрос.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 22:16     ошибка в коде
Посмотрите здесь:

Ошибка в коде - C++
Создать иерархию классов транспорт – воздушный транспорт – вертолет. Определить конструктор копирования, оператор присваивания через...

Ошибка в коде - C++
Создать абстрактную ф-ю, класса UZ, с подклассами SUZ и DUZ, вывести их на экран. #include &lt;iostream&gt; using namespace std; ...

Ошибка в коде - C++
подскажите где ошибка: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream.h&gt; #include &lt;time.h&gt; main() { srand...

Ошибка в коде - C++
Помогите пожалуйста найти ошибку #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;cmath&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...

Ошибка в коде - C++
Создать класс “Поликлиника”, состоящей из класса ”Врач”. Класс “Поликлиника”: номер поликлиники, фамилия заведующей, телефон...

Ошибка в коде - C++
Прохожу тему генератор случайных чисел. В стандартный код решил вставить бесконечный цикл ,чтобы выходить из программы только в случае...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
28.05.2012, 22:32     ошибка в коде #2
source.cpp:7:27: error: no match for 'operator<' in 'std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(((((double)n) - 2.0e+0) * ((n < 2.0e+0f) ? 1.0e+0 : 0.0))) < 1.0000000000000001e-1'

вот такой был ответ онлайн компилятора, да и в глаза срау бросается

cout<<((n-2.0)*(n<2.0))<0.1; это что типа сравнение?
компилятор пытается это понять как оператор<

cout<<((n-2.0)*(n<2.0))<0.1; что то типа
C++
1
cout.operator<<( ((n-2.0)*(n.operator<(2.0)).operator<(0.1))
вобщем то чехарда, бул продвинется до дабла, но увы подходящего опертора < не не найдено. а чего тогда ждать от компилятора. хорошо что вообще попытался понять а не выдал ФУК
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
28.05.2012, 22:36  [ТС]     ошибка в коде #3
Luke, почему ошибка это понятно, да и само выражение я от балды написал. Вопрос не об этом.
Компилятор скушает cout<<(((n-2.0)*(n<2.0))<0.1); но мне интересно узнать ответы на вопросы.

Ошибку я нарочно сделал. Мне интересно почему (double)n , 1.00000000000000005551115123125782702118158340454e-1 , зачем тернарная операция?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
28.05.2012, 22:40     ошибка в коде #4
4AKE, Зачем компилятор так преобразует выражение? ну это такая навороченная форма записи дабла. не 0.2 по человечески а с невроткудрической точностью
а внутри некий условный оператор EXP?A:B - так это от того что ты сам написал знак < компилятор пытался думать за тебя и вот что вышло
он понял (n<2.0) как условие. почему именно тернарно понял - тут уж не подскажу. может кто по опытнее есть кто сталкивался с устройством компиляторов.
х.з. короче. вопрос и правда космический. Щас если подтянуться знатоки выскажут
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
28.05.2012, 22:51  [ТС]     ошибка в коде #5
Luke, спс за ответы.
Осталось узнать про "мусор" в 0.1 , почему он только там и почему одинаков.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
28.05.2012, 22:58     ошибка в коде #6
4AKE, что то думается не мусор это а ВОТ
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 23:27     ошибка в коде
Еще ссылки по теме:

Ошибка в коде C++ - C++
Надо присвоить все данные значения в result используя цикл в цикле у меня получается значение на много больше чем должно быть что не так? ...

Ошибка в коде - C++
Код С++ #include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; void Vyvod(int**a, int m); void Sum0(int**a,int &amp;Sum0); void Sort(int**a,int...

Ошибка в коде - C++
Подскажите почему у меня vs выдает ошибку... #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

Ошибка в коде с++ - C++
#include &lt;iostream&gt; #include &quot;math.h&quot; using namespace std; int main() { double z1, z2, m; cin &gt;&gt; m; z1 =...


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

Или воспользуйтесь поиском по форуму:
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
28.05.2012, 23:27  [ТС]     ошибка в коде #7
в Вики перешел по ссылке на Хабр, вкраце прочитал. Похоже в арифметике с плавающей запятой 0.1 не имеет точного двоичного представления и 0.1 – это константа одинарной точности со всяким мусором в дроби. Короче это адь и израиль)
может кто обьяснит почему именно 1.00000000000000005551115123125782702118158340454e-1
Yandex
Объявления
28.05.2012, 23:27     ошибка в коде
Ответ Создать тему
Опции темы

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