簡體   English   中英

使用相同輸入數據的網站javascript代碼如何根據訪問者計算出不同的結果?

[英]how can website javascript code using same input data compute a different result depending on visitor?

以下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; }

在32b和64b操作系統中,似乎不是舍入錯誤或差異。

為什么不……這正是它的樣子。 甚至可能是一台16位計算機。 您正在執行許多瘋狂的浮點運算-它們通常執行許多截斷和舍入操作。


選項二:在不同的瀏覽器中實現logpowsqrt功能的方式有所不同。 解決方案-實施自己的解決方案,看看是否獲得相同的“不同”結果。

在我看來,這絕對像是舍入錯誤,而底層元素是什么(64位,32位,pow的實現等)都無關緊要。

考慮:

alpha = (pn[j-1] - pn[j])/(10*(Math.LOG10E*Math.log(of[j]/of[j-1])));
(Math.pow(of[j-1],alpha))*(Math.pow(10,0.1*pn[j-1]))

那里的權利可能會有不同的結果,因為這全都是浮動數學。 您必須使用整數或類似BigNumber的東西。

在這種情況下,printf調試有時會很有用-打印所有迭代的所有中間值(例如alpha),然后比較輸出以查看它們之間的不同之處。 給您一個起點。

調試后,事實證明,這是通過在上面未顯示的代碼中轉換為科學計數法而導致的精度損失。 因此,這是非JavaScript問題(例如,用戶錯誤)。 盡管感謝您的所有見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM