2

実生活の要求ではなく、関心から: JavaScript で 2 つの数値の指数を減算することは何とか可能ですか? JavaScriptでは正しい結果を表現できますが、 1e+29 * 1e-3(または)の結果は1e+29 / 1e+3不正確な数値になるためです。9.999999999999999e+251e+26

4

3 に答える 3

0

よりクリーンな方法が必要ですが、1つのオプションは、数値を文字列に変換し、それを操作してから、数値に戻すことです。

function exp_add(num,exp) {
    var split = num.toExponential().split('e');
    var exponent = parseInt(split[1],10);
    exponent += exp;
    return parseFloat(split[0] + "e" + exponent);
}

jsFiddleでの作業例。

于 2013-02-23T01:06:16.557 に答える
0

を使用できますがMath.log(1e29)/Math.LN10、結果は になります28.999999999999993。ベース 2 は、これらの数値に対して不正確です。したがって、最後の手段はNumber.prototype.toStringであり、正しく生成されるのは"1e29"です。今それをどのように使用できますか?

function toExp(num) {
    return num.toExponential().split("e").map(Number);
    // num.toString() only works for num <= 1e-6 and num >= 1e21
}
function fromExp(exp) {
    return exp[0] * Math.pow(10, exp[1]);
// or:     parseFloat(exp[0]+"e"+exp[1]);
}

function expMultiply(a, b) {
    return [ a[0]*b[0], a[1]+b[1] ];
}
function expDivide(a, b) {
    return [ a[0]/b[0], a[1]-b[1] ];
}

> fromExp(expMultiply(toExp(1e29), toExp(1e-3)))
1e+26
> fromExp(expDivide(toExp(1e29), toExp(1e3)))
1e+26
于 2013-02-23T01:13:19.963 に答える
0

これは、特に一方の数値が他方の数値よりもはるかに小さい場合に、浮動小数点除算の結果として自然に表示されます。ただし、数値の基数が同じ場合は、指数だけを保存する必要があります。それ以外の場合は、対数を使用できます。

( Math.log(1e29) + Math.log(1e-3) ) / Math.LN10
> 25.999999999999993

不正確さを処理し、基数 10 で結果を取得するために、その結​​果を小数点以下の数桁に丸めることができます。

于 2013-02-23T01:16:30.243 に答える