很难将 python 转换为 JS
Having a hard time converting python to JS
我正在尝试在 python 中实现 math.frexp
功能。请参阅可汗学院的 here if you're confused. Apparently, I am working on this 计划。
但是,它是PJS,不支持DataView
或ArrayBuffer
。有人可以帮我实现这个吗?
这是当前代码(由于 DataView
/ArrayBuffer
而被注释掉)。这是我在网上找到的。
var frexp = function(value) {
if (value === 0){
return [value, 0];
}
var data = new DataView(new ArrayBuffer(8));//Does not support DataView and ArrayBuffer objects.
data.setFloat64(0, value);
var bits = (data.getUint32(0) >>> 20) & 0x7FF;
if (bits === 0) {
data.setFloat64(0, value * Math.pow(2, 64));
bits = ((data.getUint32(0) >>> 20) & 0x7FF) - 64;
}
var exponent = bits - 1022,
mantissa = value * Math.pow(2, -exponent);
return [mantissa, exponent];
};
效率不如读取字节
exponent = Math.trunc( 1023+Math.log( Math.abs(value) )/Math.LN2 ) - 1022;
mantissa = value * Math.pow(2,-exponent);
应该 return 一对使得 2^(e-1) <= val < 2^e
因此 0.5 <= m < 1
。在 ECMA 6 中,商可以替换为 Math.log2
.
对数的浮点计算可能导致二元幂的结果模糊。如果 e=exponent
太小,这可能会给出错误的结果。因此添加行
if (Math.abs(mantissa) >=1 ) { exponent +=1; mantissa /=2; }
我正在尝试在 python 中实现 math.frexp
功能。请参阅可汗学院的 here if you're confused. Apparently, I am working on this 计划。
但是,它是PJS,不支持DataView
或ArrayBuffer
。有人可以帮我实现这个吗?
这是当前代码(由于 DataView
/ArrayBuffer
而被注释掉)。这是我在网上找到的。
var frexp = function(value) {
if (value === 0){
return [value, 0];
}
var data = new DataView(new ArrayBuffer(8));//Does not support DataView and ArrayBuffer objects.
data.setFloat64(0, value);
var bits = (data.getUint32(0) >>> 20) & 0x7FF;
if (bits === 0) {
data.setFloat64(0, value * Math.pow(2, 64));
bits = ((data.getUint32(0) >>> 20) & 0x7FF) - 64;
}
var exponent = bits - 1022,
mantissa = value * Math.pow(2, -exponent);
return [mantissa, exponent];
};
效率不如读取字节
exponent = Math.trunc( 1023+Math.log( Math.abs(value) )/Math.LN2 ) - 1022;
mantissa = value * Math.pow(2,-exponent);
应该 return 一对使得 2^(e-1) <= val < 2^e
因此 0.5 <= m < 1
。在 ECMA 6 中,商可以替换为 Math.log2
.
对数的浮点计算可能导致二元幂的结果模糊。如果 e=exponent
太小,这可能会给出错误的结果。因此添加行
if (Math.abs(mantissa) >=1 ) { exponent +=1; mantissa /=2; }