» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] 一个c++程序,求指点,送祭扫

费那么多话直接给个程序不得了?
#include <iostream>
void main()
{
        double denominator = 1.0;
        double pi=0.0;
        double signflag = 1.0;
        while(denominator<=100000.0)
        {
                 pi += signflag/denominator;
                 denominator += 2.0;
                 signflag *= -1.0;
        }
        pi *= 4.0;
        std::cout<<pi<<std::endl;
}


本帖最近评分记录
  • ylara 激骚 +4 我很赞同 2012-11-7 22:45

TOP

引用:
原帖由 karsus 于 2012-11-7 22:53 发表
signflag 和denominator定义的时候需要用Int,运算中强转成double,不然连续相加和相乘有浮点误差
signflag完全没必要做这种处理。因为-1.0的寄存器内存储形式是0xBFF0000000000000,而1.0的存储是0x3FF0000000000000,根据浮点乘法运算的原理,无论乘多少次也不会出岔子的。
浮点容易出问题的是在加减法,因为存在指数位对齐操作导致的尾数位移位操作。因此从理论上denominator做你说的操作并非完全无用,不过实际上那种累计式误差,主要存在于对一个变量的连续迭代上,像这种只是以常数值递增的情况,误差是可以忽略的。尤其是它的值并不很大的情况。
其实就一般习惯来说,只要注意别对浮点数使用==来判断也就差不多了。
如果要做高精度运算,一般都是不是用浮点数来做的。当然LZ这个公式的收敛速度之慢也不是高精度计算pi用的公式。



本帖最近评分记录
  • ylara 激骚 +1 最骚 Rated by wap 2012-11-12 21:35
  • ylara 激骚 +1 最骚 Rated by wap 2012-11-12 21:35

TOP

发新话题
     
官方公众号及微博