Если я правильно прочитал ваш вопрос, вы задаетесь вопросом, почему и float
s, и double
s теряют точность после настройки cout.precision
.
Это происходит потому, что числа с плавающей запятой хранятся в двоичном формате иначе, чем обычные целые числа. Общим примером того, почему это имеет значение, является то, что номер 0.6
хранится в двоичном формате как 0011111100101...
. Это, как и 0.6666666...
в десятичной форме, является бесконечно длинным числом. Таким образом, ваш компьютер должен решить, в какой момент он должен округлить/приблизиться к значению. Когда вы объявляете и инициализируете свои номера с плавающей запятой a
и b
, компьютер знает, что ему не нужно втискивать в переменную любое значение, отличное от 3.14159
. Однако, когда вы затем меняете cout.precision
, компьютер думает, что ему нужно обойти плавающую точку в более позднем месте. Кроме того, floats
всего 16 бит, поэтому он почти всегда будет менее точным, чем double
, который составляет 32 бита. См. here для их диапазонов.
Очевидно, чтобы получить правильную точность, вы не должны настраивать cout.precision
на большее, чем количество цифр вашей переменной. Однако, если вы хотите настроить точность и просто распечатать кучу нулей после окончания вашей начальной переменной, просто используйте cout << fixed << setprecision(number)
. Смотрите ниже:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a = 3.14159;
double b = 3.14159;
cout.precision(6);
cout << a << endl; //3.14159
cout << b << endl; //3.14159
cout << fixed << setprecision(10);
cout << a << endl; //3.141590118
cout << b << endl; //3.141590000
return 0;
}
Edit:Another option is to use limits
.
Определить "динамическую точность". –