用C++计算拉马努金常数

Calculate Ramanujan's constant with C++

本文关键字:马努金 常数 计算 C++      更新时间:2023-10-16

你可以看到拉马努金常数。
下面是我的代码:

#include <iostream>
#include <math.h>
#define _USE_MATH_DEFINES
using namespace std;
int main ()
{
long double s=sqrt(163);
long double P=M_PI;
long double R=exp(s*P);
cout.precision(150);
cout<<"Pi=  "<<P<<"n"<<"sqrt(163)=  "<<s<<"n"<<"R=  "<<R;
return(0);
}   

这是我的输出:

Pi=  3.141592653589793115997963468544185161590576171875
sqrt(163)=  12.767145334803704059822848648764193058013916015625
R=  262537412640768256  

我的程序有什么问题?
正确的输出是262537412640768743.99999999999925…

double的精度约为15位小数。

您的程序使用M_PI,它是double,而不是long double

因此你的答案大约有15位精度。

当您在编译行中设置long-double选项时,将调用Intel c++的长双精度80位模式。正如你将在Intel c++文档中看到的,80位长双精度是16字节对齐的,所以sizeof(长双精度)是16。

所有Windows和linux x64编译器都将SSE作为默认模式,并将所有float和double数据作为SSE数据类型。在Windows x64的早期开发中,80位的x87数据是禁止的。这个限制在完全发布时被放宽了,但是缺乏Windows库支持。在linux中,长双支持应该与gcc兼容。

80位长双精度在任何x64编译器中都有相同的问题;由于SSE和x87数据之间的转换,使用混合数据类型float/long double或double/long double的表达式可能效率低下。如果gcc选项-mfpmath=387提供了部分解决方案,那么它将以许多针对双精度和浮点数据类型的通常优化为代价,但icc没有这样的选项。

来自:

[IntelSupportForum][1]