Member 12905857 Ответов: 2

Импорт csv-файла, содержащего C++с плавающей запятой большой точности


Я импортирую csv-файл с разделителем ';' в виде строки и сохраняю их в векторе. Но данные в моем CSV содержат числа с 15 или более десятичными знаками, которые мне нужно сохранить при преобразовании в double или long double.
Преобразование из string в double в cpp (visual studio) раундов до 4 знаков после запятой. Есть ли способ, которым я мог бы разобрать двойные значения из csv непосредственно как двойные или круглые, чтобы сохранить мои десятичные знаки?

Что я уже пробовал:

Я перепробовал все возможные преобразования из string в double. (столд стоф составе стода). Преобразование из string в char*, char* в double. Я читал, что это компилятор в visual studio, который делает это округление.

2 Ответов

Рейтинг:
2

Jochen Arndt

Функции стандартной библиотеки C atof и strtod не округляются никакие десятичные знаки, которые могут быть удержаны double.

Округление происходит, вероятно, при их распечатке. Чтобы показать все значащие цифры, которые могут быть удержаны значением двойной точности, используйте [s]printf формат "%.16G" (здесь используется научный формат, чтобы избежать начальных / конечных нулей для очень малых / больших чисел).

Значение двойной точности может содержать 16 значащих десятичных цифр (более точно: DBL_MANT_DIG * log10 (2) = 15,95)

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

Если значения в файле имеют более значимые цифры, вы должны использовать десятичный формат чисел. Обратите внимание на термин "значительный". CSV-файл может быть создан путем печати значений двойной точности с большим количеством цифр (например, с использованием "%.18G"), но тогда дополнительные цифры не являются значимыми (они случайны).

С помощью long double это не вариант с Visual C/C++, поскольку он не поддерживает операции с этим типом.

Если вам нужна более высокая точность, используйте реализацию десятичного типа C++, например Глава 1. Увеличить.Вычислений с повышенной точностью - 1.62.0[^].


CPallini

5.

Рейтинг:
2

Phil J Pearson

Ни Visual Studio (которая является IDE), ни компилятор не делают никаких округлений.
Ваш код вызывает библиотечную функцию для выполнения преобразования, и библиотечная функция будет отвечать за любое округление.
Скорее всего, вы в конечном итоге позвоните, прямо или косвенно, strtold или один из его двоюродных братьев (в зависимости от размера персонажа). Они не округляются до 4 знаков после запятой.

Если Вы читаете, что компилятор делает округление, то вам следует искать свою информацию в другом месте.