用GCC和C ++实现类型“long double”11

时间:2012-12-16 17:36:32

标签: c++ double

我已经尝试搜索有关long double的信息,到目前为止,据我所知,编译器的实现方式不同。

在Ubuntu(XUbuntu)Linux 12.10上使用GCC时我得到了这个:

double PId = acos(-1);
long double PIl = acos(-1);
std::cout.precision(100);

std::cout << "PId " << sizeof(double) << " : " << PId << std::endl;
std::cout << "PIl " << sizeof(long double)  << " : " << PIl << std::endl;

输出:

PId 8  : 3.141592653589793115997963468544185161590576171875
PIl 16 : 3.141592653589793115997963468544185161590576171875

任何人都明白为什么他们输出(几乎)相同的东西?

3 个答案:

答案 0 :(得分:8)

根据reference of acos,仅当您向long double传递long double时,它才会返回std::acos。你还必须像狒狒一样使用#include <cmath> #include <iostream> int main() { double PId = acos((double)-1); long double PIl = std::acos(-1.0l); std::cout.precision(100); std::cout << "PId " << sizeof(double) << " : " << PId << std::endl; std::cout << "PIl " << sizeof(long double) << " : " << PIl << std::endl; } 。这对我有用:

PId 8  : 3.141592653589793115997963468544185161590576171875
PIl 12 : 3.14159265358979323851280895940618620443274267017841339111328125

         3.14159265358979323846264338327950288419716939937510582097494459

输出:

{{1}}

最后一行不是输出的一部分,并包含pi到此精度的正确数字。

答案 1 :(得分:5)

要获得正确的有效位数,请使用std::numeric_limits。在C ++ 11中,我们得到digits10的十进制有效数字(而不是digits,它提供了重要的)。

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

int
main()
{
  std::cout.precision(std::numeric_limits<float>::digits10);
  double PIf = acos(-1.0F);
  std::cout << "PIf " << sizeof(float) << " :  " << PIf << std::endl;

  std::cout.precision(std::numeric_limits<double>::digits10);
  double PId = acos(-1.0);
  std::cout << "PId " << sizeof(double) << " :  " << PId << std::endl;

  std::cout.precision(std::numeric_limits<long double>::digits10);
  long double PIl = std::acos(-1.0L);
  std::cout << "PIl " << sizeof(long double)  << " : " << PIl << std::endl;
}

在x86_64 linux上我得到:

PIf 4 :  3.14159
PId 8 :  3.14159265358979
PIl 16 : 3.14159265358979324

答案 2 :(得分:4)

尝试:

long double PIl = std::acos(-1.0L);

这会让你传递一个long double而不仅仅是一个被转换的int。

请注意,无论如何,大多数这些数字都是垃圾。 如果将数字与实际PI进行比较

,则使用8字节双精度可获得15个精度数
3.1415926535897932384626433

您看到只有前15个数字适合。

正如评论中所指出的那样,你可能不会得到精度的两倍,因为实现可能只使用80Bit表示,然后它取决于它为尾数预留的位数。