JavaScript Pi Spigot 算法不起作用

标签 javascript c++ pi spigot-algorithm

我翻译了以下C++代码:

#include <iostream>
using namespace std;
#define NDIGITS 100
#define LEN (NDIGITS/4+1)*14

long a[LEN];
long b;
long c = LEN;
long d;
long e = 0;
long f = 10000;
long g;
long h = 0;
int main(void) {
    cout<<b<<endl;
    for(; (b=c-=14) > 0 ;){
        for(; --b > 0 ;){
            d *= b;
            if( h == 0 )
                d += 2000*f;
            else
                d += a[b]*f;
            g=b+b-1;
            a[b] = d % g;
            d /= g;
        }
        h = printf("%ld",e+d/f);
        d = e = d % f;
    }
    getchar();
    return 0;
}

进入 JavaScript:

function mod(n, m) {
    return ((m % n) + n) % n;
} // mod function to fix javascript modulo bug
function calculate(NDIGITS){
    var LEN = (NDIGITS / 4 + 1) * 14,
        out = "",
        a = [],
        b = 0,
        c = LEN,
        d = 0,
        e = 0,
        f = 10000,
        g = 0,
        h = 0;
    for( ; a.length != LEN; a.push(0));
    for( ; (b=c-=14) > 0 ; ){
        for(; --b > 0 ;){
            d *= b;
            if(h == 0)
                d += 2000*f;
            else
                d += a[b]*f;
            g=b+b-1;
            a[b] = mod(d, g);
            d /= g;
        };
        h = 4;
        out += e + d / f;
        d = e = mod(d, f);
    };
    return out;
};
calculate(100);

问题是,C++(这是正确的)输出如下所示:

314159265358979323846264338327952884197169399375105820974944592307816406286208998628034825342117067

但是 JavaScript(这是错误的)输出看起来像这样:

3141.59265358979345928.3358757688158002.0385670499462603.1996016540431161.44919092773639662.2465149363658988.6127837844255865.38922090756173.61883094848226189.6324225085448150.3443440509899223.2179589088062808.1943642437717982.8973948575671840.86646781354151140.38694447211833938.5632867441137341.458720505086448.7384444661472807.14448220310268936.5521832735086764.9290682040381301.76585926509928223.4135991546457438.115065010927

我的编码哪里搞砸了?感谢您的帮助

最佳答案

  1. JavaScript 进行浮点除法。
  2. 在模计算函数中交换的参数。

以下代码产生的结果与为给定样本 (100) 数字提供的 C++ 代码产生的结果相同:

function mod(m, n) {
        return ((m % n) + n) % n;
} // mod function to fix javascript modulo bug

function calculate(NDIGITS) {
    var LEN = (NDIGITS / 4 + 1) * 14,
        out = "",
        a = [],
        b = 0,
        c = LEN,
        d = 0,
        e = 0,
        f = 10000,
        g = 0,
        h = 0;

    for (; a.length !== LEN; a.push(0));
    for (; (b = c -= 14) > 0;) {
        for (; --b > 0;) {
            d *= b;
            if (h === 0) {
                d += 2000 * f;
            } else {
                d += a[b] * f;
            }
            g = b + b - 1;
            a[b] = mod(d, g);
            d = Math.floor(d / g);
        }
        h = Math.floor(e + d / f);
        out += h;
        h = h.length;
        d = e = mod(d, f);
    }
    return out;
}
console.log(calculate(100));

关于JavaScript Pi Spigot 算法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25838030/

相关文章:

c++ - 在 C++ 中使用泰勒级数计算 Pi 的函数

java - 获取 BigDecimal 的第 n 位数字

Javascript 逻辑 OR 和对象

javascript - 在存储监听器中调用另一个操作是否是 Flux 的反模式?

c++ - VS 社区 2013 : cannot open include file 'winres.h'

c++ - 为什么模板参数中的 enable_if_t 提示重新定义?

javascript - JavaScript加载页面到div时显示值?

javascript - Angular JS $http 服务配置对象属性

c++ - mmap 大小调整为上一页边界

c++ - 计算pi的值-我的代码有什么问题