Форум программистов, компьютерный форум 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); } подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
28.07.2012, 12:44
Цитата Сообщение от kravam Посмотреть сообщение
Никакого пруфа, как я тебе докажу?
Из твоих слов "Весь вопрос в том, что я её вижу через раз!" я так понял, что ОДИН И ТОТ ЖЕ код у тебя через раз работает по разному

Цитата Сообщение от kravam Посмотреть сообщение
Вывожу, допустим 0.4056 со сколькими-то знаками после запятой и вижу ноли там, где они должны быть. Предсказуемая печать то есть
А потом чуть-чуть изменяю 0.4056, множа на 10 и получаю двойку где-нибудь в конце
В первом случае ты не видишь двойки не потому, что её там нет, а потому, что printf и cout по умолчанию печатают только до 6 знаков после запятой и двойка находится за пределами этих 6 знаков. Эта двойка она есть всегда, потому что число 0.4506 нельзя в двоичном виде представить в виде конечной записи (как я выше приводил конечную запись "0.1" и бесконечную "0.333..." для одного и того же числа). Другими словами, число со значением ровно 0.4056 в компьютере с двоичной логикой представить точно невозможно. В принципе. А если ты умножишь его на 10, то у тебя в очередной раз получится другое число, т.е. _не_ ровно 4.056, а очередное округлённое значение. Потому что машина в общем случае НЕ может хранить точное значение чисел. А это следует из того, что не для всякого числа, записанного в виде конечной дробной части в десятичной системе счисления, можно получить такую же конечную запись в двоичной системе счисления. Точные представления возможны только для чисел, которые раскладываются в конечный ряд по отрицательным степеням двойки (при условии, что длина этого ряда уложится в задаваемую точность конкретно float'а, double'а или long double'а)

В следующем примере мы печатаем одно и то же представление числа. И разная печать получается не потому, что в каждом случае число выглядит по разному, а потому, что при печати округление идёт до разного количества знаков после запятой. Печать float'а отличается от печати double'а из-за того, что float представляет числа с меньшей точностью (т.е. с бОльшими потерями)

C
#include <stdio.h>
 
int main (void)
{
  double d1 = 0.4056;
  double d2 = d1 * 10;
  float f1 = d1;
  float f2 = f1 * 10;
 
  /* Печать с округлением по умолчанию */
  printf ("d1=%f\n", d1);
 
  /* Печать с округлением до 6 знаков (что совпадает
   * с округлением по умолчанию */
  printf ("d1=%.06f\n", d1);
 
  /* Печать с округлением до 20 знаков */
  printf ("d1=%.020f\n", d1);
 
  /* Печать с округлением по умолчанию */
  printf ("d2=%f\n", d2);
 
  /* Печать с округлением до 6 знаков (что совпадает
   * с округлением по умолчанию */
  printf ("d2=%.06f\n", d2);
 
  /* Печать с округлением до 20 знаков */
  printf ("d2=%.020f\n", d2);
 
 
  /* Далее всё то же самое, но для float,
   * у которого числа представляются менее точно, чем у double'а */
 
  /* Печать с округлением по умолчанию */
  printf ("f1=%f\n", f1);
 
  /* Печать с округлением до 6 знаков (что совпадает
   * с округлением по умолчанию */
  printf ("f1=%.06f\n", f1);
 
  /* Печать с округлением до 20 знаков */
  printf ("f1=%.020f\n", f1);
 
  /* Печать с округлением по умолчанию */
  printf ("f2=%f\n", f2);
 
  /* Печать с округлением до 6 знаков (что совпадает
   * с округлением по умолчанию */
  printf ("f2=%.06f\n", f2);
 
  /* Печать с округлением до 20 знаков */
  printf ("f2=%.020f\n", f2);
 
 
  return 0;
}
Bash
d1=0.405600
d1=0.405600
d1=0.40560000000000001608
d2=4.056000
d2=4.056000
d2=4.05600000000000004974
f1=0.405600
f1=0.405600
f1=0.40560001134872436523
f2=4.056000
f2=4.056000
f2=4.05600023269653320312
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru