2014-01-06 28 views
1

我在JavaScript中有以下功能:測試上限函數接受一些文字在JavaScript

//foo is a number literal 
function MyFunc(foo) { 
    if(foo%15 === 0) { 
    console.log("bar"); 
    } 
} 

我想在或約在JavaScript中的Number的尺寸上限測試的行爲。

現在我知道在JavaScript中的Number s是IEEE 64位浮點數。我也知道IEEE浮點數具有子法線的概念,並且在非常大(甚至非常小)值的數學運算期間,它們顯着地失去了準確性,因此更有意義的是圍繞最大正常數進行測試?

我該怎麼辦?

回答

1

的JavaScript的正確實施將不會遇到任何錯誤評估foo%15 == 0,無論從何foo的價值在於浮點域。這主要是因爲a%b的確切數學結果從不大於a,從不大於b,所以它總是處於浮點格式的更精細的區域,所以它總是可以至少像ab,這足夠好了,因爲從a中減去b的任何倍數都不會創建比ab更精細的位。

子正常存在於正常數字的下方(幅度小於),因此前綴「sub」。最大有限正態數是最大有限數。

+0

謝謝。術語「更精細的區域」是標準的數學形容詞/名詞配對嗎? – Ben

+0

@本:這是描述性的英語,有明確的數學意義。在正常範圍內,指數指定有效位數的縮放比例。在指數較低的區間中,表示的值比指數較高的區間更接近,因此浮點格式在前一區間中更爲精細。 –

+0

我直覺地認爲,如果要求除法的結果落在指數較高的區域(因此精度較低),則操作的結果可能不準確。我認爲你答案的關鍵點是「這足夠好了,因爲從a中減去b的任何倍數從不會創建比a或b中的更精細的位」。任何擴展在這將是非常有用的。 – Ben

0

根據維基百科,雙精度浮點數的最大可表示整數爲2^53(9,007,199,254,740,992)。這對我的測試可能是一個有用的上限。

9,007,199,254,740,992%15 === 2 //obviously 
+0

IEEE-754 64位二進制浮點對象中的最大可表示整數是2 ** 1024-2 ** 971,這比2 ** 53大得多。 2 ** 53僅僅是最大的整數,它和所有更小的整數都是可表示的。 –