2013-07-04 5 views
1

У меня есть файл с номерами (пример 5.513208E-05/1.146383E-05) Я прочитал файл и сохранил записи во временной строке. После этого я преобразовываю временную строку в переменную float (которую я храню в многомерном массиве). Я использую приведенный ниже код для преобразования.C++ String to float с точностью

getline(infile, temporary_string, ','); 

Array[i][0] = ::atof(temporary_string.c_str()); 

getline(infile, temporary_string); 

Array[i][1] = ::atof(temporary_string.c_str()); 

Проблема заключается в том, что когда я печатаю поплавки на экран

5.51321e-05 1.14638e-05 вместо 5.513208E-05 1.146383E-05

Как я могу получить точные цифры, хранящиеся ???

+2

Что такое переменный тип 'Array'? Если он плавает, попробуйте изменить его на двойное. – fuenfundachtzig

+0

Ehm, 'float' даст вам приблизительно log10 (2^23) цифр, что составляет« 6,92 », поэтому от 6 до 7 цифр. –

+0

перейдите по этой ссылке http://stackoverflow.com/questions/10605653/converting-char-to-float-or-double – beyrem

ответ

4

Вы не указываете точность при чтении или преобразовании строки. Вместо того, чтобы установить точность при выводе значения:

std::cout << std::setprecision(3) << 1.2345 << '\n'; 

выше будет производить следующее oputput:

 
1.23 

смотри, например, this reference.

+0

Спасибо ... точность была прекрасна, это был конец, который округлял его – ZeW

0

Убедитесь, что у вас есть double Array[][], а не float. Текстовое представление (база 10) всегда аппроксимируется двоичным числом с плавающей запятой (база 2), но при удачном аппроксимированном числе atof имеет то же представление при использовании того же формата. В общем, вы не очень много вычисляете, а на выходе использует уменьшенную точность с помощью setprecision или форматов.

0

Каждое число чисел с плавающей запятой имеет ограниченную точность. В частности, float имеет 24 бита (1 фиксированная + 23 переменная) для своей бинарной мантиссы, что означает точность примерно семи десятичных цифр.

Если вам нужна дополнительная точность для сохраненного номера, вы можете рассмотреть возможность использования double вместо float. На обычных ПК double имеет 53 бита (1 + 52) для двоичной мантиссы, что позволяет получить точность в 15 десятичных разрядов.

Но помните, что также возникает проблема, когда эти числа выводятся. Я думаю, что точность по умолчанию для printf() и std::ostream составляет всего 6 цифр, как для float, так и для double, если не указано иное. Однако нет смысла требовать более высокой точности во время выхода, чем то, что предоставляет тип данных. Итак, хотя вы можете сказать printf("%0.30g", some_float), дополнительные 23 цифры за семь, фактически поддерживаемые типом данных, могут действительно не приносить полезной информации.

Смежные вопросы