C ++ printf打印双读为0

时间:2013-12-30 22:21:29

标签: c++ double printf cout scientific-notation

所以我想使用printf以便我可以将列排成一行,但printf似乎无法打印需要科学记数法的双打。它只是一个0,但有cout它出来很好。 'in'和'fn'是结构'x''y'和'z'是双打

代码

printf("Facet Normal: %lf %15lf %15lf\n", in->fn.x, in->fn.y, in->fn.z);
cout << "cout test: " << in->fn.x << endl;

输出

Facet Normal: -0.000000       -0.894426        0.447215
cout test: -9.6137e-08

我似乎无法让printf正常工作。我让整个函数与cout一起正常工作,但就像我说的那样,我希望事情能够很好地排列。

修改:

正如Oli所说,使用%e确实可以正确打印。通过使用%e,虽然它将所有内容都放在科学记数法中,但数据集中的许多数字实际上并不需要它。 Cout似乎根据需要在%lf和%e之间进行转换。是否有一种简单的方法可以让printf获得这种行为?

答案:

  

%f适用于float和double(因为float参数被提升为double);   %lf是长双。 f打印没有指数,e打印带指数,和   g使用哪个看起来更好(遵循特定规则)。    - 基思汤普森

%g获得了我正在寻找的确切行为!

3 个答案:

答案 0 :(得分:2)

正如std::printf() reference所说,只需使用%e

std::printf( "One double in decimal scientific notation! %e" , my_double );

但正确的C ++方式是在这种情况下使用std::cout和一些操纵符std::scientific

std::cout << "One double in decimal scientific notation!" << std::scientific << my_double;

请注意,std::cout的格式构成其状态的一部分,即您只需配置一次,格式应用于设置后的任何输出操作,并且在其他格式更改之前:

std::cout << std::scientific;

std::cout << std::pow( 10.0 , 10.0 ) << std::endl;
std::cout << std::pow( 10.0 , 20.0 ) << std::endl;
std::cout << std::pow( 10.0 , 30.0 ) << std::endl;
  

1E11
  1E21
  1e31

答案 1 :(得分:2)

您似乎希望获得“最佳”格式(这是std::ostream的默认格式):您可以使用%g%Lg long double)来拥有格式化函数决定如何格式化值。有四种格式说明符:

  1. %f用于固定点表示法(std::fixed用于流的格式)。
  2. %e用于科学格式化(std::scientific用于流的格式)。
  3. %g用于固定和科学的“最佳”版本(流的默认值以及自C ++ 11以来的std::defaultfloat)。
  4. %a表示浮点数的精确/十六进制表示(自C ++ 11 std::hexfloat起)。
  5. 格式化标志可以使用小写和大写两种形式来指示任何字符是小写还是大写(例如eE)。请注意,l长度说明符实际上与浮点格式无关。但是,在格式化L

    时,您可能需要使用long double

答案 2 :(得分:0)

如果要控制std :: cout的输出,请使用setw()和setfill()。 http://www.cplusplus.com/reference/iomanip/setw/

您也可以设置精度等。我会留给您探索。