Я хочу читать поплавки и удваивать стандартный вход и сохранять его точность (точно такие же цифры после с плавающей запятой) и иметь возможность выводить (cout/printf) как есть. Какой самый удобный (и самый простой способ) сделать это? Спасибо!Сохранение float и двойной точности в C++ во время cin/cout и scanf/printf
ответ
float f;
cin >> f;
cout << f;
Но с двойным 12345.56789 такой же aproach не работает. double d; cin >> d; cout << d; –
setprecision
.
Вот решение
cout<<setprecision(the precision you want to set here)<<variablename;
например. Если вы хотите установить точность выходного сигнала 5 для переменной var
использовать его как это:
cout<<setprecision(5)<<var;
setprecision
является манипулятором. Узнайте больше об манипуляторах here.
Он устанавливает десятичную точность, которые будут использоваться для значений с плавающей запятой
формата на выходных операциях. Ведет себя так, как будто точность элемента была вызвана с n как аргумент в потоке , на который он вставлен/извлечен в качестве манипулятора (он может быть вставлен/извлечен на входные потоки или выходные потоки).
Это манипулятором и объявлен в заголовке <iomanip>
Поскольку вход имеет неизвестную точность, самый простой способ, чтобы читать их в виде строк, а не удваивается/поплавки.
Если вам нужно значение float, требуется простая строка для двойного преобразования.
Любой другой метод, вероятно, будет терпеть неудачу, поскольку вы полагаетесь на несовершенное преобразование из строки в float, выполняемое стандартной библиотекой.
Последний не может различать 0,4 и 0,40.
Поскольку float/double не являются бесконечной точностью, единственный способ сделать это надежно - прочитать его как строку и сохранить исходную строку вместе с преобразованным float/double. –
Невозможно сделать. Причина очевидна - в stdin/stdout числа с плавающей запятой представлены в виде десятичных чисел (это требование стандартов). Стандарты C или C++ не определяют внутреннее представление чисел с плавающей запятой, поэтому невозможно написать переносное преобразование из строки в float/double и назад. Даже используемое де-факто стандартное представление чисел не допускает десятичных двоичных обратимых преобразований в общем случае. Для иллюстрации: попробуйте преобразовать 1/3 в десятичную нотацию и обратно, сохраняя точность. –