Установка точности двойного без использования потока (ios_base :: precision)

Есть ли способ сделать это без использования потока? Например, что-то вроде этого:

double a = 6.352356663353535;
double b = a.precision(5);

вместо:

double a = 6.352356663353535;
std::cout.precision(5);
std::cout << a << std::endl;

Я новичок в C ++, и мне любопытно. Заранее спасибо.

6

Решение

doubles почти повсеместно реализуются как IEEE числа с плавающей точкой. Их точность зависит только от размера номера (в случае double, что означает «число с плавающей запятой двойной точности», Это 53 бита). Невозможно вручную установить точность числа с плавающей запятой.

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

5

Другие решения

Я пересмотрел код с учетом предложений @john, @Konrad и @ KennyTM. Я проверил, что это работает с отрицательными числами.

#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
double a = 6.352356663353535;
double  intpart;
double fractpart = modf (a, &intpart);
fractpart  = roundf(fractpart * 100000.0)/100000.0; // Round to 5 decimal places
double b = intpart + fractpart;
printf("%.5lf", b);
}

Выходы

6.35236
5

double всегда имеет одинаковую внутреннюю точность (наиболее вероятно, 53 бита двоичной точности), независимо от того, что вы делаете. Только при записи двойного в виде текста в десятичной форме вы можете контролировать десятичную точность вывода. Поэтому нет, вы не можете установить точность двоичного числа двойной точности ни на что, кроме его собственной точности (не говоря уже о десятичной точности).

Если все, что вам нужно, это округлить число до заданного числа десятичных цифр, тогда обратитесь к Phillipответ (но с поправками, которые Джон а также Konrad сделал в своих комментариях, конечно). Но обратите внимание, что это не меняет предисловие базового типа, и все вычисления с этим числом будут выполняться в двоичной двойной точности. Также такое округленное десятичное число не обязательно должно быть представлено точно в базовом двоичном типе с плавающей запятой.

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector