用C++计算拉马努金常数
Calculate Ramanujan's constant with C++
你可以看到拉马努金常数。
下面是我的代码:
#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]
相关文章:
- 为什么 g++ 使用 movabs 和一个奇怪的常数来简单还原?
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 为什么在C++负数static_cast如果<unsigned>数字是常数,则不同
- 亚马逊在线评估编码问题,以找到第n个几何级数
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 提高詹金斯进程优先级?
- 如何使用阿尔法努姆算法对C++中的文本行进行排序?
- 如何在C++中将函数值更改为表中的值(伽马分布)?
- 贝金纳C++练习解决方案的意外输出
- 变量和常数的C++划分不起作用
- 我应该将乘数声明为常数还是直接使用它而不声明?
- 马洛克和新认识对方吗?
- 按常数偏移折线
- 如何在 C 和 C++ 中定义字符常数?
- 如何在亚马逊kinesis_video_gstreamer_sample_app.cpp中更改视频源?
- 如何检查马洛克是否持有锁
- 在CUDA内核中传递一个常数整数
- 我可以将艾根·莱文伯格·马夸特与线性方程和常数雅可比矩阵一起使用吗?
- 错误的输出 - 拉马努金阶乘和C++的近似
- 用C++计算拉马努金常数