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

Компилятор сломался или ошибка? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Выход по нажатию клавиши из терминала (Linux(UNIX) http://www.cyberforum.ru/cpp-beginners/thread629180.html
Уважаемые программисты, возникла проблема. Есть клиент, в нем 2 потока. Нужно организовать выход из программы по нажатию комбинации клавиш "Ctrl + D". Вот примерная схема. void *runStdIn() { char message listenSocket(sock, message); printf("%s", message); }
C++ Создайте класс с именем Employee, включающий в качестве элементов данных три информационных пункта: имя, фамилию и месячную зарплату Дело обстоит так: Прочитав и, как я думал, поняв 3ю главу книги "Как программировать на с++" Дейтелов пришло время задачек. Немного собравшись я решил задачи 3.11 и почти правильно сделав 3.12 (потом я нашёл где же я сделал промах, благодаря этому форуму :) и ошибка оказалась совсем мелкой ). Казалось бы всё, остальные пойдут хорошо и мне не прийдётся задалбывать кого-либо тупыми вопросами,... http://www.cyberforum.ru/cpp-beginners/thread629111.html
C++ Надо ускорить алгоритм вычисления чисел с не повторяющимися цифрами
Помогите ускорить алгоритм. Надо определить все числа с не повторяющимися цифрами от 0 до 9876543210. У меня время просчета занимает очень длительное время уже на 8-значном числе. Что-то не могу догнать как сделать быстрее. Вот код: #include <iostream> #include <vector> #include <time.h> #include <Windows.h> using namespace std; const int size = 1000000; //нужно ускорить алгоритм до...
C++ Считывание символа с потока для дальнейших действий
Пользователь должен по запросу ввести символ для определения операции: сложения, вычитания или умножения матрицы на число. Не получается считать этот символ с потока. VC++.6 #include <stdio.h> const int m = 2; const int n = 3; void InitMatrix(int A); void PrintMatrix(int A); void Addition(int A1,int A2,int A3);
C++ Компилятор просит указать const в конструкторе http://www.cyberforum.ru/cpp-beginners/thread629094.html
Всем привет. Изучаю С++ по Р.Лафоре. В одном из заданий, к главе 8 понадобилось написать класс, представляющий простую дробь, и написать перегруженные операторы: -, +, * и /. Собственно проблем никаких - написал, перегрузил. Решил перегрузить заодно и оператор присваивания, путём указания соответствующего конструктора с одним аргументом того же типа: ... код ... Fract(Fract fr) : ...
C++ MessageBox API MessageBox API: не получаеться обработать выбор. Мой код: int SELECT = MessageBox(hwnd, _T("Вы действительно хотите завершить работу программы? ВНИМАНИЕ! В случае завершения работы программы, клиенты не смогут подключиться."), _T("Завершение работы"), MB_OKCANCEL | MB_ICONQUESTION); if (SELECT = MB_OK) { PostQuitMessage(0); } подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
28.07.2012, 20:55     Компилятор сломался или ошибка?
Цитата Сообщение от kravam Посмотреть сообщение
если ты говоришь значит так оно и есть, но округлением я всё же это называть бы не стал. Скорее, некоторое преобразование
Да, это преобразования называются «потеря значащих цифр» и «двоичное округление».
Цитата Сообщение от kravam Посмотреть сообщение
это недостаток машин, а не объективная реальность. Согласен, корень из двух однозначно не представить, хотя бы в силу его бесконечности. К сожалению, я не знаю, как машина определяет, что число double, наверное, какой-то бит отвечает за это. Так-то я бы показал, как в памяти разместить число, которое однозначно интерпретировалось бы как 0.4056
Всякие float, single и double в подавляющем большинстве случаев представляются и хранятся в памяти в соответствии со стандартом IEEE 754. Потеря точности и так далее — это недостаток данного представления.

Числа с плавающей десятичной точкой, коими и являются double с float, не предназначены для точных вычислений. Они предназначены для представления широкого диапазона чисел. Естественно, они их представляют с погрешностью, но в отличие от целочисленных величин погрешность фиксирована не абсолютная, а относительная. Поэтому они и удобны для всяких физических вычислений, где точнее 10–15 представлять ничего не надо, потому что измерить точнее не получается.

Для точного представления рациональных чисел есть другие приёмы. Например, числа с фиксированной точкой (это когда 0,4056 так и хранится как целое число 4056 с припиской, что десятичная точка находится перед четвёртой справа цифрой). Или буквально как дроби (целый числитель и целый знаменатель). Эти способы гарантируют абсолютную точность вычислений и, соответственно, никаких внезапных двоек в конце не будет появляться. (Конечно, работать это будет медленее и памяти кушать больше, но это если хочется точное значение. Именно для «быстро прикинуть» и есть арифметика с плавающей точкой.)

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