javascript - 使用相同输入数据的网站 JavaScript 代码如何根据访问者计算出不同的结果?

标签 javascript

下面的 JavaScript 代码片段位于网站上。最近,我观察到该代码可以为网站上的访问者产生不同的结果,这与我使用访问者输入到网站的完全相同的数据从我的计算机获得的结果不同。这似乎取决于访客(有些访客很好)。我在办公室尝试了多台计算机/操作系统,它们都根据相关访问者的输入数据产生相同(正确)的结果。

网站提供的部分结果(下面未显示)是用户输入数据的绘图,我观察到它总是正确的,因此我知道访问者在网站中输入的输入数据(从中进行 JavaScript 计算)用于计算结果)被他们的机器正确解释(我可以看到用户收到的图(由自动 PDF 电子邮件生成),并且在我的计算机中输入的相同数据会为输入的数据生成完全相同的图;只是从这些数据得出的结果是不同的)。

在我分析的一个案例中,访问者的错误数据神秘地总是比正确结果低 1.3 倍。 32b 与 64b 操作系统似乎没有舍入误差或差异。

有什么想法可能导致这样的事情吗?下面的代码对于所有版本的 javascript 来说都不健壮,还是不同的 javascript 版本会产生不同的结果(似乎很难相信,但我在下面使用了一些奇特的数学,也许其中一个 mat 函数已经过时了)。不幸的是,我无法访问生成错误数据的机器来进行故障排除。我也不了解访问者使用的机器/操作系统/平台(可能是任何东西)。任何想法表示赞赏。我对 javascript 不太有经验(这可能是下面显而易见的事情)。

提前致谢。

function calculate(){
    var fc=document.abcform.CF.value*1;
    var of = new Array(20);
    var pn = new Array(20);
    var pj = new Array(19);
    var cbox = new Array(20);
    var alpha;
    var con;
    var segment;
    var subttl=0;
     of[0]=document.abcform.OS1.value*1; pn[0]=document.abcform.abc1.value*1;
     of[1]=document.abcform.OS2.value*1;  pn[1]=document.abcform.abc2.value*1;
     of[2]=document.abcform.OS3.value*1;  pn[2]=document.abcform.abc3.value*1;
     of[3]=document.abcform.OS4.value*1;  pn[3]=document.abcform.abc4.value*1;
     of[4]=document.abcform.OS5.value*1;  pn[4]=document.abcform.abc5.value*1;
     of[5]=document.abcform.OS6.value*1;  pn[5]=document.abcform.abc6.value*1;
     of[6]=document.abcform.OS7.value*1;  pn[6]=document.abcform.abc7.value*1;
     of[7]=document.abcform.OS8.value*1;  pn[7]=document.abcform.abc8.value*1;
     of[8]=document.abcform.OS9.value*1;  pn[8]=document.abcform.abc9.value*1;
     of[9]=document.abcform.OS10.value*1;  pn[9]=document.abcform.abc10.value*1;
     of[10]=document.abcform.OS11.value*1;  pn[10]=document.abcform.abc11.value*1;
     of[11]=document.abcform.OS12.value*1;  pn[11]=document.abcform.abc12.value*1;
     of[12]=document.abcform.OS13.value*1;  pn[12]=document.abcform.abc13.value*1;
     of[13]=document.abcform.OS14.value*1;  pn[13]=document.abcform.abc14.value*1;
     of[14]=document.abcform.OS15.value*1;  pn[14]=document.abcform.abc15.value*1;
     of[15]=document.abcform.OS16.value*1;  pn[15]=document.abcform.abc16.value*1;
     of[16]=document.abcform.OS17.value*1;  pn[16]=document.abcform.abc17.value*1;
     of[17]=document.abcform.OS18.value*1;  pn[17]=document.abcform.abc18.value*1;
     of[18]=document.abcform.OS19.value*1;  pn[18]=document.abcform.abc19.value*1;
     of[19]=document.abcform.OS20.value*1;  pn[19]=document.abcform.abc20.value*1;  

      cbox[0]=document.abcform.c1.checked; cbox[1]=document.abcform.c2.checked; cbox[2]=document.abcform.c3.checked;
      cbox[3]=document.abcform.c4.checked; cbox[4]=document.abcform.c5.checked; cbox[5]=document.abcform.c6.checked;
      cbox[6]=document.abcform.c7.checked; cbox[7]=document.abcform.c8.checked; cbox[8]=document.abcform.c9.checked;
      cbox[9]=document.abcform.c10.checked; cbox[10]=document.abcform.c11.checked; cbox[11]=document.abcform.c12.checked;
      cbox[12]=document.abcform.c13.checked; cbox[13]=document.abcform.c14.checked; cbox[14]=document.abcform.c15.checked;
      cbox[15]=document.abcform.c16.checked; cbox[16]=document.abcform.c17.checked; cbox[17]=document.abcform.c18.checked;
      cbox[18]=document.abcform.c19.checked; cbox[19]=document.abcform.c20.checked; 

    for (var i = 0; i <= 18; i++) { pj[i] = '' }
    for (var j = 1; j <= 19; j++){
        if (j == 1 || cbox[j]) {
            alpha = (pn[j-1] - pn[j])/(10*(Math.LOG10E*Math.log(of[j]/of[j-1])));
            con = (Math.pow(of[j-1],alpha))*(Math.pow(10,0.1*pn[j-1]));
            if ((alpha <= (1 + 1e-14)) && (alpha >= (1 - 1e-14))) { 
                segment = con*Math.log(of[j]/of[j-1]); }
                else { segment = (con/(1-alpha))*(Math.pow(of[j],1-alpha)-Math.pow(of[j-1],1-alpha)); }
            pj[j-1] = round(1E12*(Math.sqrt(2*segment))/(2*Math.PI*fc));
            subttl = subttl + Math.pow(pj[j-1],2);
        }   else {break;}
    }
    document.abcform.pj1.value=pj[0]; document.abcform.pj2.value=pj[1]; document.abcform.pj3.value=pj[2];
    document.abcform.pj4.value=pj[3]; document.abcform.pj5.value=pj[4]; document.abcform.pj6.value=pj[5];
    document.abcform.pj7.value=pj[6]; document.abcform.pj8.value=pj[7]; document.abcform.pj9.value=pj[8];
    document.abcform.pj10.value=pj[9]; document.abcform.pj11.value=pj[10]; document.abcform.pj12.value=pj[11];
    document.abcform.pj13.value=pj[12]; document.abcform.pj14.value=pj[13]; document.abcform.pj15.value=pj[14];
    document.abcform.pj16.value=pj[15]; document.abcform.pj17.value=pj[16]; document.abcform.pj18.value=pj[17];
    document.abcform.pj19.value=pj[18];
    document.abcform.tj.value=round(Math.sqrt(subttl));
    }

function round(x) { return Math.round(x*100000)/100000; }

最佳答案

Doesn't seem like a rounding error or difference in 32b vs 64b OS.

为什么不...这正是看起来的样子。甚至可能是 16 位机器。您正在执行大量疯狂的浮点运算 - 它们通常会执行大量 chop 和舍入。

<小时/>

选项二:logpowsqrt 函数在不同浏览器上的实现方式有所不同。解决方案——实现您自己的解决方案,看看是否得到相同的“不同”结果。

关于javascript - 使用相同输入数据的网站 JavaScript 代码如何根据访问者计算出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357261/

相关文章:

javascript - Google跟踪代码管理器数据推送。无法使用php

使用函数将数组中的Javascript输出元素作为数组进行分割

javascript - 在蛇类游戏中跟踪分数的问题

javascript - 如何检查 qml 中的现有文件夹?

javascript - 如何计算动态表中复选框的数量

javascript - 正则表达式在函数中是如何工作的?

javascript - 由于显示 :flex;,SmartMenus 在 Chrome 上无法正常工作

javascript - 我希望 html 选择的 ID 和名称具有不同的值

javascript - 如何防止 CSS 粘贴到 contenteditable div 中

javascript - 从数组中过滤出数字