【问题标题】:JavaScript Pi Spigot Algorithm not workingJavaScript Pi Spigot算法不起作用
【发布时间】:2014-09-14 21:06:52
【问题描述】:

我已经翻译了以下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

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

【问题讨论】:

    标签: javascript c++ pi spigot-algorithm


    【解决方案1】:
    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));
    

    【讨论】:

    • 我怀疑这个答案对除了你之外的任何人都有帮助,所以考虑撤回这个问题。
    • 非常感谢您的回答!我忘记了 C++ 没有使用 long 数据类型进行浮点除法。你的回答真的帮助了我。我会考虑撤回问题,或者只是重新措辞以更好地帮助他人。再次感谢您的回答。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2022-08-06
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多