Только 2 цифры в показателе научного потока - PullRequest
4 голосов
/ 11 августа 2009

Таким образом, согласно cplusplus.com, когда вы устанавливаете флаг формата выходного потока в научную нотацию через

of.setf(ios::scientific)

вы должны увидеть 3 цифры плюс и знак в экспоненте. Тем не менее, я, кажется, только 2 в моем выводе. Есть идеи? Скомпилировано в Mac OS с использованием GCC 4.0.1.

Вот фактический код, который я использую:

of.setf(ios::scientific);
of.precision(6);
for (int i=0;i<dims[0];++i) {
    for (int j=0;j<dims[1];++j) {
    of << setw(15) << data[i*dims[1]+j];                    
    }
    of << endl;
}

и пример строки вывода:

   1.015037e+00   1.015037e+00   1.395640e-06  -1.119544e-06  -8.333264e-07

Спасибо

Ответы [ 5 ]

4 голосов
/ 11 августа 2009

Это зависит от реализации.

3 голосов
/ 11 августа 2009

Я считаю, что cplusplus.com неверен или, по крайней мере, документирует конкретную реализацию - я не вижу никаких других онлайн-документов, в которых конкретно указано количество отображаемых экспонент - я даже не могу найти его в Спецификация C ++.

Редактировать

Стандартная библиотека C ++: Учебное пособие и справочная информация не содержит явного числа цифр экспоненты; но все его примеры показывают две цифры показателя степени.

0 голосов
/ 08 октября 2009

Это ошибка в реализации M $ AFAIK

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/624b679a4faf03d

0 голосов
/ 11 августа 2009

Мне только что пришла в голову мысль - поскольку я печатаю плавающие числа, зачем отображать 3 значения экспоненты, поскольку показатель max / min равен ~ 38. Бьюсь об заклад, если бы массив данных был типа double, было бы 3.

0 голосов
/ 11 августа 2009

Я получаю 3 в MSVC ++ 08 и g ++ 4.4.0 с этим кодом:

#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>

typedef float NumberType;

double generate_number(void)
{
    return static_cast<NumberType>(std::rand()) / RAND_MAX;
}

void print_number(NumberType d)
{
    std::cout << std::setw(15) << d << std::endl;
};

int main(void)
{
    std::vector<NumberType> data;

    std::generate_n(std::back_inserter(data), 10, generate_number);

    // print
    std::cout.setf(std::ios::scientific);
    std::cout.precision(6);
    std::for_each(data.begin(), data.end(), print_number);
}

Вы можете легко изменить тип номера, который он использует. Это дает мне три места с float и double, и стандарт ничего не говорит о реальном форматировании, поэтому я бы пошел с mgb ответом .

...