2015-08-14 2 views
0
#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.precision(10); 
    cout << a << endl; //3.141590118 
    cout << b << endl; //3.14159 
    cout.precision(20); 
    cout << a << endl; //3.141590118408203125 
    cout << b << endl; //3.1415899999999998826 
    return 0; 
} 

Может ли кто-нибудь объяснить разницу между поплавком и двойным? Как мы печатаем float/double с динамической точностью?Как отключить float/double с динамической точностью?

+3

Определить "динамическую точность". –

ответ

1

Предполагая, что у меня есть ваше определение динамического правильного что-то подобное должно работать:

void print(float toPrint, int precision) 
{ 
    cout.precision(precision); 
    cout << toPrint <<endl; 
} 

cout.precision изменяет только точность печати, это фактически не влияет, как точные цифры. Если вы печатаете с большим количеством цифр, чем ваши цифры имеют точность, вы получите неточные цифры.

Конечно, cout.precision также изменяет только максимальную точность печати. Для того, чтобы заставить его печатать завершающие нули, сделать что-то вроде этого:

void print(float toPrint, int precision) 
{ 
    cout.precision(precision); 
    cout << fixed; 
    cout << toPrint <<endl; 
} 

Разница между поплавком и двойной, что двойной приблизительно в два раза точно, как поплавок. В общем, float имеет что-то вроде 7 или 8 цифр точности, а double имеет 15 или 16 цифр точности.

+0

Что случилось с четвертым cout? Он распечатывает 3.14159 после cout.precision (10). Зачем? –

+0

@Jiayi Простой, вы сказали ему распечатать с точностью до 10 цифр, поэтому он округлил 11-ю цифру.Это было 9, поэтому он округлился, добавив один к предыдущей цифре, сделав его 10, добавив один к предыдущей цифре. И т. Д. –

+0

Тогда почему он не печатает 3.141590000? –

0

Не имеет смысла иметь «динамическую точность», где отображаются все цифры, отличные от 0. Этот режим имел бы проблемы с дробными числами с бесконечными десятичными цифрами, такими как результат 1.0/3.

Лучшее, что вы можете сделать, это установить максимальную точность, которую вы хотите видеть, с помощью precision, как и в вашем примере.

0

Если я правильно прочитал ваш вопрос, вы задаетесь вопросом, почему и 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.