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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
01.03.2013, 22:37     Фиксированная точка в printf() и удаление лишних нулей #1
Есть число 0.000000000001 и мне его нужно вывести на экран, но если написать
C++
1
printf("%.37f", 0.000000000001);
выводится 0.0000000000099999... в общем не точное число. Через std::fixed получается, но тут встает проблема.
Как мне вывести число с неизвестным размером после точки, если оно может поменяться на более глубокое... по умолчанию выводится не больше 5 знаков после точки, но можно поставить %.37f, чтобы как минимум весь диапазон float выходил, но остаются нули в конце, если число меньше. А в cout (у которого fixed есть) вообще не получается контролировать количество чисел после запятой...

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

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

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

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

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

Экспоненциальная запись не красива, на осмысление числа понадобиться больше времени, чем если оно в десятичном виде... хотя понятие, что оно маленькое прийдет сразу, при виде большой отрицательной степени))
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
02.03.2013, 11:02     Фиксированная точка в printf() и удаление лишних нулей #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);
}
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
02.03.2013, 19:59  [ТС]     Фиксированная точка в printf() и удаление лишних нулей #11
Я во что откопал !))
http://habrahabr.ru/post/131171/
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.03.2013, 21:21     Фиксированная точка в printf() и удаление лишних нулей #12
подразумевалось, что ты знаешь, что такое "числа с плавающей точкой".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2013, 21:36     Фиксированная точка в printf() и удаление лишних нулей
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
02.03.2013, 21:36     Фиксированная точка в printf() и удаление лишних нулей #13
Цитата Сообщение от MrCath Посмотреть сообщение
Я во что откопал !))
Посмотрел по штрих-диагонали. Конечно, ваши раскопки заслуживают более серьезного изучения.
Yandex
Объявления
02.03.2013, 21:36     Фиксированная точка в printf() и удаление лишних нулей
Ответ Создать тему
Опции темы

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