在JavaScript进行大整数计算

最近在云谦的影响下,开始学习CoffeeScript,写了一个大整数计算的类库:js-BIO

js-BIO(全称为 JavaScript Big Integer Operations)的原理非常简单,就是模拟纸笔运算,输入数字后,它就像一位小学生一样耐心地一位一位地计算。目前它支持正整数的加、减、乘、除、求余,以及大于、等于、小于等运算。

来看几个例子:

var a = "218093290301725279849294552737145306526429515095910348328784867259719961681262317171990366018836471452273795738712382654617011499370332067465452153429131133154474494728461513797156576311424209209825768452476998761186844896333150192092696406370188813135474544186922431865203259468892782696696554856807492686240273426580684476908600903286664578178500293562463803241679236095343405558144595606432072340054",
	b = "759453421168594746297585634824794585057708073795685055048450994660667302169842440997187780071628842999365618342370044730249364762070171939525787172608446535167458760784909718498489041640160903072085566658168644606091524276643802085431070120034640336353069020700940598038997582524596177336508",
	c;

// 计算 a + b
c = BIO.add(a, b);
console.log(c); // => 218093290301725279849294552737145306526429515095910348328784867259719961681262317171990366018836471452273795739471836075785606245667917702290246738486839206950159549776912508457823878481266650207013548524105841760552463238703194922342061168440360752661261716795368967032662020253802501195185596496968395758325840084749329083000125179930466663609570413597104139594748256796284003597142178131028249676562

// 计算 a - b
c = BIO.minus(a, b);
console.log(c); // => 218093290301725279849294552737145306526429515095910348328784867259719961681262317171990366018836471452273795737952929233448416753072746432640657568371423059358789439680010519136489274141581768212637988380848155761821226553963105461843331644300016873609687371578475896697744498683983064198207513216646589614154706768412039870817076626642862492747430173527823466888610215394402807519147013081835895003546

// 计算 a * b
c = BIO.multiply(a, b);
console.log(c); // => 165631695453560768931354179676327783789554654471289094267396314999551619350086706770637603163259782521350605065527228675367441009889563464536042123812298158775025038552756989906635218183772046533558978457853765293877902141330057087553963131601282691171759816841117292436049592274238065569156249246125691526163874951713797884657704497629753668671292281869762553374641310311774140912980126830919151808832669504364383900117665833031771105917192115442091637918088985032215601898962325376736104912045524501146768304386244267559527475259139329594399610587041338732488477674534017135328109239900803529659849632039837754817318175918697532072796924765669004218196032450409366708571087537016172564891432

// 计算 a / b
c = BIO.divide(a, b);
console.log(c); // => 287171384343938182302166283267955634005236318876904228926536131374862297188572994580923635532994904266143630527

// 计算 a mod b
c = BIO.mod(a, b);
console.log(c); // => 592025574073873421838644719778706564169852072684877302818315404363803007260660346662730591457239291807144570448333654917475379749402034885167586678975138436729309695698180319906813373242540831615098968972192135361399928745893872371373756948364150937205578085919887319866770529450275971960338

根据 js-BIO 的原理,它能处理的数字大小只取决于可用内存的大小。当然,模拟纸笔计算的效率并不是很高,因此,如果输入的数字越大,计算所需的时间也就越长。

有兴趣的童鞋可以在 GitHub 上查看 js-BIO 的最新源码,也可以在这儿在线试用一下

另外,也顺便写一下使用 CoffeeScript 的感想。:-)

我们都知道时间是宝贵的,在计算机世界里,一开始时计算机的时间比程序员的时间宝贵,慢慢地,随着机器越来越快,这个情况发生了改变,现在大多数情况下已经是程序员的时间比机器的时间更宝贵了。

很早以前,程序员必须写机器码,直接与机器打交道,后来人们发明了汇编,再后来又发明了 C/C++、Java、Python 等高级语言,这个过程中程序员写的代码与机器能直接执行的代码之间的差别越来越大,但程序员的效率大大提高了。但计算机并不能直接执行 C/C++ 等高级语言,这些高级语言都需要先被编译成机器码计算机才能理解并执行。从高级语言编译成的机器码几乎一定不是所有能完成那个任务的机器码中最优的,如果有人有足够的耐心以及智慧,对特定的问题一定能写出更好的机器码来,但是对现代计算机世界而言,这样做的成本太高了,所以大多数情况下大家依旧在使用执行效率可能不那么高的高级语言进行开发,因为大多数情况下开发效率比执行效率更重要。

CoffeeScript 可以算是一种比 JavaScript 稍微高级一点点的语言,所有 CoffeeScript 能做的事用纯 JavaScript 也能做到,事实上,CoffeeScript 在编译之后生成的就是纯 JavaScript。但是,CoffeeScript 从很多其他现代语言(比如 Ruby、Python)中借鉴了很多极具表达力的设计,因此,在完成同一件事时,CoffeeScript 的代码往往能比对应的 JavaScript 更加简洁,同时可读性一点也没有丢失(甚至可能更好)。

从这个角度来看的话,我认为 CoffeeScript 是很有价值的,JavaScript 与 CoffeeScript 的关系,虽然没有汇编与 C 这么大的差异,但也有一些类似。使用 CoffeeScript 等语言能让你将更多的精力放到解决问题上,而不是语言的细节上。一般来说,如果你的代码更短了,那你可能犯错误的地方也就更少了。当然,CoffeeScript 也不是万能药,如果你的目标不仅仅是使用 JavaScript 解决问题,而是要写出一个非常优雅精悍的 JavaScript 程序,那么继续使用原生的 JavaScript 大概是不二之选。

总的来说,如果你经常要写 JavaScript,而且正想折腾点什么的话,试试 CoffeeScript 吧,或许你也会喜欢它的!

2014-03-03更新:CoofeeScript很多方面的确不错,但是还是少了一些我期待的特性,现在我已经很少用CoffeeScript了,大部分时间还是继续写原生JavaScript。:)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s