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

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

Восстановить пароль Регистрация
 
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 115
28.05.2012, 22:16     ошибка в коде #1
День добрый. Есть код (не рабочий):
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++
Ошибка в коде! C++
Ошибка в коде 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
Сообщений: 115
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
Сообщений: 115
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++ Ошибка в коде
Ошибка в коде C++

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

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

Текущее время: 05:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru