【问题标题】:Comparison of double, long double, float and float128?double、long double、float和float128的比较?
【发布时间】:2018-11-30 19:09:27
【问题描述】:

为什么double、long double、float没有区别?

比如piC++中的计算是,

#include <iostream>
#include <quadmath.h>
#include <math.h> 

int main()
{
  float  PI0 = acos(-1.0);
  double PI1 = acos(-1.0);
  long double PI2= acos(-1.0L);

  __float128 x = acos(-1.0);
  char buf[128];
  quadmath_snprintf (buf, sizeof buf, "%*.34Qf",10, x);


  std::cout << "Float=" << PI0 << std::endl;
  std::cout << "Double=" << PI1 << std::endl;
  std::cout << "LongDouble=" << PI2 << std::endl;
  std::cout << "Float128=" << buf << std::endl;

}

在终端中:

g++ -std=c++14 FileName.cpp -Wall -pedantic -lquadmath && ./a.out 

输出:

Float=3.14159
Double=3.14159
LongDouble=3.14159
Float128=3.1415926535897931159979634685441852

详情:https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

【问题讨论】:

  • 这是一个表现问题。打印浮点值时尝试使用std::setprecision
  • 另外,为了完全正确,您应该使用floatacos 重载P0。如float P0 = acos(-1.0f);
  • doublelong double 可能是同一类型,具体取决于您的平台/编译器。您可以检查它们是否适合您static_assert(sizeof(double) != sizeof(long double));
  • doublelong double,正如@Kaldrr 所说,在 Windows 上可以是相同的大小:msdn.microsoft.com/en-us/library/9cx8xs15.aspx
  • 你给std::setprecision传递了什么值? wandbox.org/permlink/n8fCNPHYQimYEICm

标签: c++ floating-point arithmetic-expressions


【解决方案1】:

我的平台没有 __float128,但这里有一个示例,显示了 float、double 和 long double 的精度输出:

#include <cmath> 
#include <iomanip>
#include <iostream>
#include <limits>

int main()
{
  float PI0 = std::acos(-1.0F);
  double PI1 = std::acos(-1.0);
  long double PI2 = std::acos(-1.0L);

  constexpr auto PI0_max_digits10 = std::numeric_limits<decltype(PI0)>::max_digits10;
  constexpr auto PI1_max_digits10 = std::numeric_limits<decltype(PI1)>::max_digits10;
  constexpr auto PI2_max_digits10 = std::numeric_limits<decltype(PI2)>::max_digits10;

  std::cout << "Float=" << std::setprecision(PI0_max_digits10) << PI0 << std::endl;
  std::cout << "Double=" << std::setprecision(PI1_max_digits10) << PI1 << std::endl;
  std::cout << "LongDouble=" << std::setprecision(PI2_max_digits10) << PI2 << std::endl;
}

【讨论】:

  • 太棒了。完美运行。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多