很难将python转换为J

2024-10-03 23:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python实现math.frexp函数。如果您感到困惑,请参阅here。很显然,我正在汗学院的this项目上工作。你知道吗

但是,它是PJS,不支持DataViewArrayBuffer。有人能帮我实现这个吗?你知道吗

以下是当前代码(由于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];
};

Tags: newdatareturnifvaluevarmathbits
1条回答
网友
1楼 · 发布于 2024-10-03 23:22:26

它的效率不如读取字节

exponent = Math.trunc( 1023+Math.log( Math.abs(value) )/Math.LN2 ) - 1022;
mantissa = value * Math.pow(2,-exponent);

应该返回一对,这样2^(e-1) <= val < 2^e0.5 <= m < 1。在ecma6中,商可以用Math.log2代替。你知道吗

对数的浮点运算可能导致二次幂的模糊结果。如果e=exponent太小,可能会得到错误的结果。因此添加行

if (Math.abs(mantissa) >=1 ) { exponent +=1; mantissa /=2; }

相关问题 更多 >