gpt4 book ai didi

javascript - 在没有 Float32Array 的情况下将 "float"转换为 Javascript 中的字节

转载 作者:数据小太阳 更新时间:2023-10-29 04:37:11 25 4
gpt4 key购买 nike

好吧,我遇到了一个相当烦人的情况,我无法访问诸如 Float32Array 之类的类型化数组,但仍然需要能够将 Javascript 数字转换为字节。现在,我可以很好地处理一个整数,但我不知道如何处理浮点值。

我已经用另一种方法解决了这个问题(将字节转换为 float ),但是关于从 float 转换为字节的文档非常稀缺,因为大多数语言只允许您读取指针或具有用于处理的通用类

理想情况下,我希望能够将 float 转换为 4 字节和 8 字节的表示形式,并选择使用哪一种。但是,可以简单地获取一个数字并将其输出为 8 字节的代码仍然很棒,因为我可能可以从那里自己想出 32 位版本。

最佳答案

好吧,我真的想通了,所以我将分享我的单精度和 double 解决方案。现在我不能保证它们 100% 符合标准,但它们不需要循环并且看起来工作得很好:

单精度(给定十进制值输出单个 32 位大端整数和二进制表示):

function toFloat32(value) {
var bytes = 0;
switch (value) {
case Number.POSITIVE_INFINITY: bytes = 0x7F800000; break;
case Number.NEGATIVE_INFINITY: bytes = 0xFF800000; break;
case +0.0: bytes = 0x40000000; break;
case -0.0: bytes = 0xC0000000; break;
default:
if (Number.isNaN(value)) { bytes = 0x7FC00000; break; }

if (value <= -0.0) {
bytes = 0x80000000;
value = -value;
}

var exponent = Math.floor(Math.log(value) / Math.log(2));
var significand = ((value / Math.pow(2, exponent)) * 0x00800000) | 0;

exponent += 127;
if (exponent >= 0xFF) {
exponent = 0xFF;
significand = 0;
} else if (exponent < 0) exponent = 0;

bytes = bytes | (exponent << 23);
bytes = bytes | (significand & ~(-1 << 23));
break;
}
return bytes;
};

double (给定十进制值输出两个 32 位整数,二进制表示形式为大端顺序):

function toFloat64(value) {
if ((byteOffset + 8) > this.byteLength)
throw "Invalid byteOffset: Cannot write beyond view boundaries.";

var hiWord = 0, loWord = 0;
switch (value) {
case Number.POSITIVE_INFINITY: hiWord = 0x7FF00000; break;
case Number.NEGATIVE_INFINITY: hiWord = 0xFFF00000; break;
case +0.0: hiWord = 0x40000000; break;
case -0.0: hiWord = 0xC0000000; break;
default:
if (Number.isNaN(value)) { hiWord = 0x7FF80000; break; }

if (value <= -0.0) {
hiWord = 0x80000000;
value = -value;
}

var exponent = Math.floor(Math.log(value) / Math.log(2));
var significand = Math.floor((value / Math.pow(2, exponent)) * Math.pow(2, 52));

loWord = significand & 0xFFFFFFFF;
significand /= Math.pow(2, 32);

exponent += 1023;
if (exponent >= 0x7FF) {
exponent = 0x7FF;
significand = 0;
} else if (exponent < 0) exponent = 0;

hiWord = hiWord | (exponent << 20);
hiWord = hiWord | (significand & ~(-1 << 20));
break;
}

return [hiWord, loWord];
};

对于复制/粘贴过程中的任何错误,我们深表歉意,代码也省略了任何字节序处理,尽管添加起来相当容易。

感谢大家提出的建议,但我最终主要是靠自己解决问题,因为我想尽可能避免循环以提高速度;它仍然不是非常快,但它会做 =)

关于javascript - 在没有 Float32Array 的情况下将 "float"转换为 Javascript 中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15935365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com