Double сколько знаков после запятой c
Перейти к содержимому

Double сколько знаков после запятой c

  • автор:

Количество знаков после запятой 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

  1. Деление целочисленных дает целочисленное, остаток отсекается.
  2. По умолчанию вещественные имеют тип данных 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

Именно этот результат мы и ожидали:

Отметим ещё раз — в самой программе используются все возможные знаки и разряды чисел, цифры обрезались в момент вывода.

Смотрите также онлайн учебник «Основы С++».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *