Могу ли я использовать std: fixed или std :: setprecision () с оператором >>? - PullRequest
0 голосов
/ 28 декабря 2018

std::istringstream теряет точность при преобразовании строки в long double.Могу ли я использовать что-то похожее на std::fixed или std::setprecision()?

Я использую c ++ 11 и нацелен на платформу QNX.

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main(){
    long double convertedNumber;
    std::string numberString ("5.94865747678615882510631e+4931");

    //From string to long double
    std::istringstream iss(numberString);
    iss >> convertedNumber;

    std::cout<< std::setprecision(30) << numberString << "\n";
    std::cout<< std::setprecision(30) << convertedNumber << "\n";

    return 0;
}

Выходные данные

5.94865747678615882510631e+4931
5.9486574767861588254e+4931

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Проблема, с которой вы столкнулись, не имеет ничего общего с использованием setprecision или потоков.

80-битный двойной (long double) недостаточно велик для хранения числа, которое выпытаясь хранить с точностью, которую вы хотите.80-битные двойные числа имеют мантиссу из 64 битов, что означает, что точность чисел, которые она может представлять, равна 64-битному целому числу, которое само ограничено 19 [десятичными] цифрами значения.Значение, которое вы пытаетесь сохранить, составляет (5.9486_57476_78615_88251_0631) 24 десятичных знака значения, что означает, что оно просто слишком точное, чтобы быть точно представленным вашей программой.

Если вы хотите сохранить это значение в вашей программе,вам нужно сохранить его в строковом представлении или найти библиотеку произвольной точности для представления / манипулирования этими числами.Я рекомендую использовать библиотеку boost.multiprecision , хотя это зависит от вашей организации / задачи, разрешающей использование библиотек C ++ Boost.

0 голосов
/ 28 декабря 2018

Да, это будет работать, это функции, которые используются для любого потока.поток - это конструкция для приема и отправки байтов. Поток использует

<< Оператор вставки </p>

И >> оператор извлечения

Функция std :: setprecision - это потоковый манипулятор , который можно применять для любого потока EDIT , если вы задаетесь вопросом, почему он не имеет точности 30, потому чтовы потеряли точность при выполнении

iss >> convertedNumber;

И поток iss является наиболее точным числом в соответствии с вашими данными.Придерживайтесь ответа Xirema для более технического объяснения и решения

...