Количество знаков после запятой double, Long double
Есть число большой точности A.
A=-1.768573656315270993281
742915329544712934120053405549882
337511135282776553364635382011977
933536332198647808795874576643230
034448609820608458844529169083285
379260833581131961323480667495949
838043253626912240448884745364662
8324959064543;
Какой тип переменных вмещает их как константы? Сколько можно чисел после запятой?
Double 308 знаков после запятой?
Long double 4932?
Не ругается максимум на 125 символов после запятой для double в компиляторе Visual Stdio 2008 , где еще половина?
Какое самое малое число можно разделить на 1000 не превышая точность Long double?
Рисую фракталы, мне нужна точность. Процессор 32 bit.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Какая функция определяет количество знаков после запятой переменной double?
У меня есть программа, которая считает сумму ряда, в неё вводится значение x, точность, с которой.

Подсчет знаков после запятой в переменной double
Не получается, так как в double числа хранятся не точно, и на моменте, когда i == 3345333, d ==.
Как вывести double до 2 знаков после запятой?
Нужно вывести число до 2 знаков после запятой. Попробовал так: 1) round(a*100)/100; 2) .

Точность в N знаков после запятой числа типа double
Добрый день, уважаемы форумчане! Возникла проблема, заключающаяся в изменении значения.
Количество знаков после запятой c++
Если выводить с помощью СИшного printf(«%.9f», res) — выводится 4.000000000, 1.500000000 При выводе с помощью std. cout
Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
задан 17 дек 2019 в 17:46
13 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Ничего не понял. 8./2. — это и есть 4.000000000 , а 3./2. — это и есть 1.500000000 . В чем проблема?
17 дек 2019 в 20:16
В постановке задачи. Мне нужен именно такой формат вывода, который я описал.
17 дек 2019 в 23:30
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
cout
2.714285714
Смотрите всякие разности форматирования тут.
Отслеживать
ответ дан 17 дек 2019 в 17:50
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
Для 19 и 7 Ваш вариант сработал. Но есть 2 проблемы: при 8.0/2.0 выводит 4, а мне нужен вывод 4.0; при, например, 40.0/3.0 выводит только 8 значений после запятой
17 дек 2019 в 18:04
Ну поднимите точность - она учитывает все знаки.
17 дек 2019 в 18:12
- Деление целочисленных дает целочисленное, остаток отсекается.
- По умолчанию вещественные имеют тип данных double , в спецификации формата printf() он указывается как %lf .
printf("%.9f",19.0F/7.0F); // float -> double printf("%.9lf",19.0/7.0); // double -> double printf("%.9Lf",19.0L/7.0L); // long double -> long double
Подробнее можно почитать тут и тут.
Отслеживать
ответ дан 17 дек 2019 в 17:48
1,937 5 5 серебряных знаков 24 24 бронзовых знака
неверно. в printf double — это как раз %f , а %Lf — это уже long double . Спецификатора формата %lf в принципе нет.
17 дек 2019 в 19:10
преобразовывать в double . и да для scanf 'а значения спецификаторов отличаются. это один из старых квирков Си.
17 дек 2019 в 19:31
@Πανμέτρονάριστον Можно тоже как %f . При передаче float в сишный . -параметр он автоматически преобразуется в double . См. en.cppreference.com/w/cpp/io/c/fprintf
17 дек 2019 в 19:31
@Fat-Zer Посмотрел cppreference. Там написано, что %lf есть (добавили в C++11/C99), и не отличается от %f (оба могут и в float и double ).
17 дек 2019 в 19:34
@HolyBlackCat, да. моя ошибка. %lf — это тоже что и %f по всем стандартам.
17 дек 2019 в 19:47
Если выводить с помощью СИшного printf("%.9f", res)
Просто используй спецификатор %g:
printf("%.9g", 19./7); // 2.71428571 printf("%.9g", 3./2); // 1.5 printf("%.9g", 8./2); // 4 printf("%.9g", sqrt(10101)); //100.503731
Стоит помнить, что это 9 значащих цифр, а не 8 цифр после точки. Если нужно именно последнее, то можно сделать как-то так:
double res = sqrt(10101); printf("%.*g\n", 8 + 1 + (int)log10(res), res); // 100.50373127
Double сколько знаков после запятой c
Как по уму подсчитать количество значемых знаков после запятой в double?
Только ли через sprintf, _ecvt, _fcvt, _gcvt самому подсчитывая?
Re: Количество знаков после запятой в double
| От: | superman |
| Дата: | 12.09.07 11:26 |
| Оценка: |
Здравствуйте, Symon, Вы писали:
S>Как по уму подсчитать количество значемых знаков после запятой в double?
S>Только ли через sprintf, _ecvt, _fcvt, _gcvt самому подсчитывая?
В зависимости от того зачем это надо
ИМХО в большинстве случаев только введя внешнее ограничение типа "знаки выше Н-ого не значащие"
sprintf в этом деле мало поможет, самому считать тоже безполезно
Re: Количество знаков после запятой в double
| От: | Erop |
| Дата: | 12.09.07 12:28 |
| Оценка: |
Здравствуйте, Symon, Вы писали:
S>Как по уму подсчитать количество значемых знаков после запятой в double?
S>Только ли через sprintf, _ecvt, _fcvt, _gcvt самому подсчитывая?
Вообще-то в файле limits.h описана константа DBL_EPSILON, кажется.
Это самое маленькое положительное число, которое при приюавлении к 1.0 даёт ответ отличный от 1.0
Это так сказать принципиальное железное ограничение.
Просто обычно, в реальных задачах количество реально значащих цифр меньше того, на которое позволяет надеяться величина этой константы.
Поясни зачем тебе нужно количество знаков после запятой?
Да, кстати, можно ещё и так:
int calcDigCount() < double eps = 1.0; double base = 1.0; int digCount = 0; while( base + eps != base ) < eps *= 0.1; assert( eps >0 ); digCount++; > assert( eps > 0 ); return digCount; >
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Количество знаков после запятой в double
| От: | vayerx |
| Дата: | 12.09.07 17:29 |
| Оценка: |
Здравствуйте, Symon, Вы писали:
S>Как по уму подсчитать количество значемых знаков после запятой в double?
S>Только ли через sprintf, _ecvt, _fcvt, _gcvt самому подсчитывая?
frexp() + std::numeric_limits::digits() [ + ldexp() ]
Re: Количество знаков после запятой в double
| От: | Symon |
| Дата: | 13.09.07 05:49 |
| Оценка: |
На самом деле, причина не такая уж и извращённая, как могло показаться:
нужно в зависимости от стартового значения выводить последующие с тем же кол-вом знаков после запятой.
Например ряд чисел и соответствующих выводимых значений должен бы выглядеть так:
1.45 — стартовое значение так и выводится "1.45", для дальнейшего вывода будут использоваться 2 знака после запятой:
2.9 — "2.90"
4.0 — "4.00"
5.4 — "5.40"
6.55 — "6.55"
А вот решение с применением класса MFC — CString
UINT GetDecimalDigitsCount (double dStartValue) < CString strBuffer; strBuffer.Format (_T("%f"), dStartValue); strBuffer.TrimRight(_T('0')); return static_cast (strBuffer.GetLength() - strBuffer.Find (_T('.')) - 1); >
Re: Количество знаков после запятой в double
| От: | MasterZiv |
| Дата: | 13.09.07 06:33 |
| Оценка: |
Symon пишет:
> Как по уму подсчитать количество значемых знаков после запятой в double?
Нет в double и float количества знаков после запятой. Как понятия нет.
Так что посчитать невозможно.
во-первых, положение запятой определяется форматом вывода.
Во-вторых, количество десятичных знаков неопределено. Их столько,
сколько ты хочешь напечатать.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Количество знаков после запятой в double
| От: | Symon |
| Дата: | 13.09.07 06:36 |
| Оценка: |
Здравствуйте, MasterZiv, Вы писали:
MZ>Symon пишет:
>> Как по уму подсчитать количество значемых знаков после запятой в double?
MZ>Нет в double и float количества знаков после запятой. Как понятия нет.
MZ>Так что посчитать невозможно.
MZ>во-первых, положение запятой определяется форматом вывода.
MZ>Во-вторых, количество десятичных знаков неопределено. Их столько,
MZ>сколько ты хочешь напечатать.
Ты долго думал чтоб ТАКУЮ УМНУЮ МЫСЛЬ напесать.
ЗЫ см. мой же пост в этом топике над твоим
Re[2]: Количество знаков после запятой в double
| От: | alzt |
| Дата: | 13.09.07 06:43 |
| Оценка: |
Здравствуйте, Symon, Вы писали:
отформатировать чтоли надо было?
Re[3]: Количество знаков после запятой в double
| От: | Symon |
| Дата: | 13.09.07 06:49 |
| Оценка: |
Здравствуйте, alzt, Вы писали:
A>Здравствуйте, Symon, Вы писали:
A>отформатировать чтоли надо было?
Почему в C++ для double в числе только 5 цифр после запятой
В языке C++ при определении переменных необходимо указать их тип, причём в дальнейшем тип менять нельзя.
Для числовых переменных распространёнными типами являются int, short, long, float и double.
К примеру, переменная с типом данных float — это число с плавающей точкой, для хранения которого используется 4 байта, а это 6-9 значимых цифр, обычно 7.
А переменная с типом данных double — это число с плавающей точкой, для хранения которого используется 8 байт, а это примерно 15-18 значимых цифр, обычно 16.
Зная это, рассмотрим следующий простейший код — для его выполнения, сохраните код в файл test.cpp:
#include using namespace std; int main () < // определение чисел: short s; int i; long l; float f; double d; // присвоение значений числам; s = 10; i = 1000; l = 1000000; f = 230.4732; d = 30949.12345678; // печать чисел; cout
Теперь скомпилируйте его:
g++ test.cpp
./a.out
Результат выполнения очень необычен:
short s :10 int i :1000 long l :1000000 float f :230.473 double d :30949.1
Число 230.4732 обрезано до 230.473 — потерян одна цифра после запятой. А в числе типа double, значение которого 30949.12345678, обрезалось до 30949.1 — то есть вместо предполагаемых 15-18 значимых цифр получено только 6…
Отсюда возникает вопрос, почему в числе типа double можно использовать только 6 значимых цифр?
На самом деле, число double d содержит все цифры после запятой, которые присвоены этой переменной — всё дело в том, как выполняется проверка числа. У метода cout имеются свои настройки по умолчанию для вывода и форматирования чисел — если в числе больше 6 разрядов, то обрезаются цифры после запятой, если до запятой также больше 6 цифр, то используется научная запись числа, например 1.23457e+14.
Такое поведение по умолчанию cout можно исправить. Для этого, во-первых, необходимо добавить новый заголовок #include .
Во-вторых нужно использовать std::setprecision(n), где n — это новая величина точности.
При использовании в выражении out или in >> setprecision(n) устанавливает для параметра точности потока out или in значение ровное n.
Отредактирует код нашей программы:
#include #include using namespace std; int main () < // определение чисел: short s; int i; long l; float f; double d; // присвоение значений числам; s = 10; i = 1000; l = 1000000; f = 230.4732; d = 30949.12345678; // печать чисел; cout
Заново скомпилируем и выполним его. Результат:
short s :10 int i :1000 long l :1000000 float f :230.4732 double d :30949.12345678
Именно этот результат мы и ожидали:
Отметим ещё раз — в самой программе используются все возможные знаки и разряды чисел, цифры обрезались в момент вывода.
Смотрите также онлайн учебник «Основы С++».