我是首先在[1] 注意到 Spigot-Algorithm的,这个算法公布的相当早。见[2].  [1] 给出几个令人惊异的程序。仅仅用非常少的代码就能够计算e,pi,log(2)等常数。

当中那个4行代码计算圆周率的程序被网友称作外星人写的程序。但我一直没有勇气去分析和学习它,近期最终决定学习这个 Spigot-Algorithm,先看了文献【3】。明确了其基本思想。遂计划尝试编写各种计算常数的代码。并写一个系列博客。从这篇開始,我将讲述假设使用这个算法计算各种常数或者级数的和。

数列a[n]={1/1,1/2,1/3,1/4... 1/n} 被称作调和数列。调和数列的和f(n)= 1/1 + 1/2 + 1/3 +1/4 + ... 1/n 被称作调和级数。调和级数是最简单的级数之中的一个。

用Spigot 算法来计算这个级数也最为简单。

以下给出代码。

详细说明以后补上。

#define R 10		//进制。可改为100。1000,10000。
#define FMT_STR "%d" //当R=100,1000,10000时。对应的,须要改为"%02d","%03d","%04d",
#define N 10 //计算交错级数的前10项
#define P 20 //当R=10^k时,可打印前P*k位有效数字
int a[N+1],i,j,x;
void main()
{
for (i=N;i;a[i--]=1);
for (j=0;j<P;j++)
{
x=0;
for (i=N;i;i--)
{
x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;
}
x+=a[i]*R;
printf(FMT_STR,x/R); a[0]=x/R;
if ( j==0)
printf(".");
}
}

几点说明:

  1. 数组的长度和计算的项数有关,而和终于精度无关。

2. a[1] to a[n]存储第j轮计算时。各项的分子。

  3. 每轮计算中。得到2位10进制数。最高位直接输出,次高位缓存在a[0]

  4. 当N大于10时。计算结果错误。这是由于交错级数收敛非常慢. 当得到次高位时就急于输出最高位仍是冒险的方法。

改进的方法是当得到第5位时再输出最高位,然后将第2到5位存储在a[0],以下是改动后的代码,可正确计算交错级数前100项的值。

#define R 10  //进制,可改为100。1000,10000,
#define FMT_STR "%d" //当R=100,1000,10000时,对应的,须要改为"%02d","%03d","%04d",
#define N 100 //计算交错级数的前N项
#define P 100 //当R=10^k时,可打印前P*k位有效数字
int a[N+1],i,j,x;
void main()
{
for (i=N;i;i--)
a[i]=1;
for (j=0;j<P+1;j++)
{
x=0;
for (i=N;i;i--)
{
x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;
}
a[0]= a[0]*R + x;
if ( j>2)
{
printf(FMT_STR,a[0]/(R*R*R*R));
a[0]%=(R*R*R*R);
if ( j==3)
printf(".");
}
}
}

參考文献:

1. Tiny programs for constants ,http://numbers.computation.free.fr/Constants/constants.html

1. M. Abramowitz and I. Stegun, Handbook of Mathematical Functions, Dover, New York, (1964)

3. https://en.wikipedia.org/wiki/Spigot_algorithm



Spigot 算法之中的一个 计算调和级数的和的更多相关文章

  1. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  2. 声明式编程:程序=数据+逻辑(what)+算法(控制+计算)

    接口:what: 实现:算法:指令: 编程语言中,凡是不涉及到算法的部分,都可以认为是声明式编程. 命令式编程可以与算法划等号:算法要求严格的计算逻辑和控制,是实施细节的精准描述: 命令式编程与声明式 ...

  3. The Pragmatic Programmer 读书笔记之中的一个 DRY-Don’t Repeat Youself

     The Pragmatic Programmer读书笔记之中的一个 DRY-Don't Repeat Youself 尽管自己买了非常多软件project方面的书,可是由于时间的问题.一直没有静 ...

  4. poj 1741 楼教主男人八题之中的一个:树分治

    http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...

  5. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...

  6. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  7. hdu1465不easy系列之中的一个(错排)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  9. C#算法之判断一个字符串是否是对称字符串

    记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...

随机推荐

  1. 集合框架(04)HashMap

    集合Map的简单方法:该集合存储键值对,一对一对往里面存,而且要保证健的唯一性 1.添加 put(K key,V value) putAll(Map<? Extends k, ? extends ...

  2. Android UI 常用图标尺寸规范

    1. 程序启动图标: LDPI (Low Density Screen,120 DPI),其图标大小为 36 x 36 px. MDPI (Medium Density Screen, 160 DPI ...

  3. C# html的Table导出到Excel中

    C#中导出Excel分为两大类.一类是Winform的,一类是Web.今天说的这一种是Web中的一种,把页面上的Table部分导出到Excel中. Table导出Excel,简单点说,分为以下几步: ...

  4. sql server mvp 發糞塗牆

    http://blog.csdn.net/dba_huangzj/article/details/38295753

  5. SQL数据库学习系列之一

    数据库知识的重要性不言而喻,以下链接给出了最最基础知识的讲解. 第一讲:SQL 语法 第二讲:SQL SELECT 语句 第三讲:SELECT DISTINCT 语句 第四讲:SQL WHERE 子句 ...

  6. NAND Flash memory in embedded systems

    参考:http://www.design-reuse.com/articles/24503/nand-flash-memory-embedded-systems.html Abstract : Thi ...

  7. tq2440实验手册qt编译问题

    转载:http://blog.sina.com.cn/s/blog_6182b82201015ym1.html 编译qtopia最好使用的是低版本的gcc和g++. 举个简单的例子在qtopia的源代 ...

  8. DotnetBrowser高级教程-(5)使用内置的MVC UI框架-EasyMvc

    如果DotnetBrowser只是实现了内置chrome浏览器和web/web socket server,似乎还不是很完美.因此,最新的DotnetBrowser已经内置对easy mvc控件的支持 ...

  9. log4j教程 8、日志格式化

    Apache log4j 提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据.另外,也可以创建一个布局对象格式化测井数据中的特定应用的方法. 所有的布局对象 - Appender对象收到 L ...

  10. PHP 在源代码中实现换行使得页面源代码更精致美观

    常量 : PHP_EOL 换行实例: <? php echo $this->doctype($this->doctype) . PHP_EOL;?> <html> ...