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

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

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

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

28.05.2012, 22:16. Просмотров 362. Ответов 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 одинаков при обработке разными компиляторами? (я думал мусор там рандомен и будет отличаться на "разных" компах).
Извиняйте, если не правильно поставил вопрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 22:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ошибка в коде (C++):

Ошибка в коде (Ошибка сегментирования (core dumped) - C++
Добрый день. Подскажите пожалуйста, где ошибка в коде? char ch; string s; while ((ch = cin.get()) != '0' ) ...

В чём ошибка.В коде там где коментарий там ошибка поучается. - C++
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; class CMyString{ char *pStr; public: ...

Ошибка в коде - C++
FOR( 0, c_obj ){ if( !objs-&gt;a ){ int j = 0; while( species-&gt;action != 0 &amp;&amp; j &lt; c_species - 1 ){ j++; } if(...

Ошибка в коде. - C++
Простая программа: просто ввод и вывод матрицы. Выдает ошибку уже после компиляции. Мой код: #include &lt;stdio.h&gt; #include...

Ошибка в коде - C++
#include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; int func(int **a,int k, int p) { double kol=1; for(int i=0;...

Ошибка в коде - C++
Доброго времени суток, помоги найти ошибку в коде, пожалуйста class Base { public: virtual ~Base() { ...

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

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

Ошибка в коде - C++
Задача: Получить максимальную по длине неубывающую под последовательность цифр введенного числа. Ошибка возникает в случае если эта под...

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

Ошибка в коде - C++
#include &lt;stdio.h&gt; void main() { int num; scanf(&quot;%x&quot;,&amp;num); printf(&quot;%o\n&quot;,num); printf(&quot;%x\n&quot;,num«2); -тут ошибка(красным...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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