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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
#1

Фиксированная точка в printf() и удаление лишних нулей - C++

01.03.2013, 22:37. Просмотров 4147. Ответов 12
Метки нет (Все метки)

Есть число 0.000000000001 и мне его нужно вывести на экран, но если написать
C++
1
printf("%.37f", 0.000000000001);
выводится 0.0000000000099999... в общем не точное число. Через std::fixed получается, но тут встает проблема.
Как мне вывести число с неизвестным размером после точки, если оно может поменяться на более глубокое... по умолчанию выводится не больше 5 знаков после точки, но можно поставить %.37f, чтобы как минимум весь диапазон float выходил, но остаются нули в конце, если число меньше. А в cout (у которого fixed есть) вообще не получается контролировать количество чисел после запятой...

Да, можно профиксить, записать в символьный массив, отсеять нули с конца... Но мне нужно, чтобы код было маленьким... Нет ли способа для таких случаев?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Фиксированная точка в printf() и удаление лишних нулей (C++):

Вывод на экран в двоичной системе без лишних нулей - C++
bitset<8> (p); в качестве аргумента не принимает переменную,мне нужно вывести на экран например 5 ввиде 101 ,а не 00000101,есть ли другая...

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один)) - C++
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со своей библиотекой, которая включает в себя...

Удаление лишних пробелов - C++
Доброго времени суток уважаемые профики С++. Хотелось бы узнать как сделать функцию удаление лишних пробелов? То есть что бы по 1...

Удаление лишних пробелов - C++
Знаю, тема изъёрзана) но вот код, и своих функций он не выполняет( #include <iostream> using namespace std; int main() {...

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

Удаление лишних пробелов - C++
Помогите пожалуйста с задачей: Разработать алгоритм и программу для удаления лишних пробелов в тексте (лишними считать> 1 пропуска).

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,458
01.03.2013, 22:59 #2
Есть такой формат
C
1
 printf("%*.f", prec, val);
Значение prec придется подобрать самому
1
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
01.03.2013, 23:24  [ТС] #3
А можно подробней?
* - в данном случае значение, которое определяет количество цифр до запятой...
и в любом случае, мне выходит в ответ 0, даже без точки с дробью...
0
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,458
01.03.2013, 23:38 #4
Цитата Сообщение от MrCath Посмотреть сообщение
* - в данном случае значение, которое определяет количество цифр до запятой...
Прошу прощения. Конечно printf("%.*f"...) Звезда после точки.
Но вам не мешало бы посмотреть форматы printf-а

Добавлено через 1 минуту
Хотя бы это http://lord-n.narod.ru/download/book.../13/printf.htm
1
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
02.03.2013, 00:46  [ТС] #5
Хорошо, с выводом дроби без дополнительных нулей есть идеи... но что вы посоветуете делать с фиксацией точки? Можете пожалуйста написать пример функции printf, которая значение типа float или double выведет без дефектов (например, долбаных девяток, что были представлены в первом посте)? Роюсь роюсь, не могу отрыть...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
02.03.2013, 01:08 #6
А чем тебе не угодил твой вариант?
Цитата Сообщение от MrCath Посмотреть сообщение
printf("%.37f", 0.000000000001);
Просто не пытайся вывести 37 знаков после запятой - выводи поменьше.
C++
1
printf("%.15f", 0.000000000001);
Добавлено через 3 минуты
Цитата Сообщение от MrCath Посмотреть сообщение
выводится 0.0000000000099999... в общем не точное число.
%lf возможно изменит что-то, иначе сейчас твоя double константа приводится к float

а вообще чего ты хотел от двоичных чисел с плавающей точкой? Десятичные дроби в них всегда будут не совсем точно преобразовываться.
1
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
02.03.2013, 01:24  [ТС] #7
Да я все это уже рассматривал - не катит... не катит)))
Да, я знаю, что от них ничего хорошего не жди, я обижен)))
Просто должно выводиться число, которое будет по любому около 1E -8 - 1E - 15... В любом случае, без шаманства не обойтись, а так надеялся, что просто был не внимательный при поиске и пропустил легенький путь)))

Под легким путем, я подразумеваю решение, в одну - три строчки...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
02.03.2013, 01:26 #8
тип double + вывод в экспоненциальной форме.
не?
1
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
02.03.2013, 01:33  [ТС] #9
Есть тема с std::cout...
Узнать количество цифр после запятой, а потом, используя std::setw, std::setprecision, std::fixed вывести ответ... вроде работает... но в три действия не умещается)))
Всем спасибо большое)

Экспоненциальная запись не красива, на осмысление числа понадобиться больше времени, чем если оно в десятичном виде... хотя понятие, что оно маленькое прийдет сразу, при виде большой отрицательной степени))
0
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,458
02.03.2013, 11:02 #10
Вот откопал в архивах. Должно работать (у меня работало)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dformat(double dr)  /* Определение формата плавающего числа */
{  char *pt, *q0, *q9, *q, b[200]; int kz, k=0;
 
      sprintf(b,"%.19g",dr);
      if (strchr(b,'e')!=NULL) return(-1);
      if ((pt=strplus(b,'.'))==NULL) return(0);
      if (dr<1 && dr>-1) while(*pt=='0') { pt++; k++; }
      if (*pt=='\0') return(0);
      q0 = strstr(pt,"000");
      q9 = strstr(pt,"999");
      if (q0!=NULL && q9!=NULL) q=(q0 < q9) ? q0 : q9;
      else if (q0!=NULL) q = q0;
      else if (q9!=NULL) q = q9;
      else q = strchr(pt,'\0');
      kz = q - pt + k;
      return(kz);
}
0
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
02.03.2013, 19:59  [ТС] #11
Я во что откопал !))
http://habrahabr.ru/post/131171/
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
02.03.2013, 21:21 #12
подразумевалось, что ты знаешь, что такое "числа с плавающей точкой".
0
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,458
02.03.2013, 21:36 #13
Цитата Сообщение от MrCath Посмотреть сообщение
Я во что откопал !))
Посмотрел по штрих-диагонали. Конечно, ваши раскопки заслуживают более серьезного изучения.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2013, 21:36
Привет! Вот еще темы с ответами:

Удаление лишних символов - C++
Имеется файл txt.txt в котором 50 000 строк, просто физически это обработать тяжело. Нужно удалить все эти знаки ( ) | и 0. (Левая...

Рекурсия. Удаление лишних пробелов - C++
Доброго времени суток! Подскажите как реализовать с помощью рекурсии задачу: описать функцию, которая удаляет из строки все лишние пробелы.

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

Удаление лишних пробелов в начале и конце строки. - C++
Нужно написать функцию char*alltrim(char*string) для удаления пробелов в начале и конце строки с помощью указателей. Помогите завершить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.03.2013, 21:36
Ответ Создать тему
Опции темы

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