我已经尝试搜索有关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
任何人都明白为什么他们输出(几乎)相同的东西?
答案 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表示,然后它取决于它为尾数预留的位数。