在Javascript中将浮点数转换为二进制表示形式的最简单方法是什么?(例如1.0 - > 0x3F800000).
我试图手动完成,这在一定程度上(通常的数字)起作用,但是对于非常大或非常小的数字(没有范围检查)和特殊情况(NaN,无穷大等)都会失败:
function floatToNumber(flt)
{
var sign = (flt < 0) ? 1 : 0;
flt = Math.abs(flt);
var exponent = Math.floor(Math.log(flt) / Math.LN2);
var mantissa = flt / Math.pow(2, exponent);
return (sign << 31) | ((exponent + 127) << 23) | ((mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}
Run Code Online (Sandbox Code Playgroud)
我重新发明轮子了吗?
编辑:我改进了我的版本,现在它处理特殊情况.
function assembleFloat(sign, exponent, mantissa)
{
return (sign << 31) | (exponent << 23) | (mantissa);
}
function floatToNumber(flt)
{
if (isNaN(flt)) // Special case: NaN
return …Run Code Online (Sandbox Code Playgroud) 任何人都建议一个良好的压缩算法,适用于双精度浮点值?我们发现浮点值的二进制表示使用常见的压缩程序(例如Zip,RAR,7-Zip等)导致非常差的压缩率.
我们需要压缩的数据是一个8字节值的一维数组,以单调递增的顺序排序.这些值表示开尔文温度,跨度通常低于100度.值的数量范围从几百到最多64K.
澄清
数组中的所有值都是不同的,但由于表示浮点值的方式,在字节级别确实存在重复.
由于这是科学数据,因此需要无损算法.如果存储效率有显着提高,则可以接受以足够精度(~5位小数)转换为定点表示.
更新
找到一篇关于这个主题的有趣文章.不确定该方法对我的要求的适用程度.
如何手动将十进制(基数为10)的数字转换为IEEE 754单精度浮点格式?我知道它有三个部分,一个符号,一个指数和一个尾数.我只是不完全理解最后两个部分实际代表什么.
在我的C++程序中,我需要从外部字节序列中提取64位浮点数.有没有办法确保在编译时双打是64位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读本文并实际寻找确保以IEEE 754格式存储的方法,请查看下面的Adam Rosenfield的答案.
一个double(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数的范围是该字节数的一半?
例如,8字节双精度可以完全精确地保持四字节无符号整数的范围吗?
这将归结为如果两个字节的浮点数可以保持一个字节无符号整数的范围.
一个字节的无符号int当然是0 - > 255.
可能重复:
比较C#中的double值时出现问题
我在其他地方读过它,但是真的忘记了答案,所以我再次问这里.无论你用任何语言编写它,我都不会结束这个循环(我用C#,C++,Java测试它):
double d = 2.0;
while(d != 0.0){
d = d - 0.2;
}
Run Code Online (Sandbox Code Playgroud) 我正在做一些数学计算(尝试使用VS2010将Matlab代码转换为C++),我需要能够判断在某些时候我得到负0.
根据IEEE标准-0/+ 0仅在符号位上有所不同(其余为0).
我使用下面的代码(post)将我的double解释为unsigned char
double f = -5;
unsigned char *c = reinterpret_cast<unsigned char *>(&f);
for(int i=(sizeof(double)-1); i>=0; i--){
printf("%02X", c[i]);
}
Run Code Online (Sandbox Code Playgroud)
尝试用5/-5我得到预期的结果:
C014000000000000 (-5)
4014000000000000 (5)
Run Code Online (Sandbox Code Playgroud)
但是当我用0/-0尝试它时,我在这两种情况下都只得到零.VS2010声称它们符合IEEE标准(msdn),所以我不确定它的哪一部分我没有得到.
如果0/-0确实以完全相同的方式存储在内存中,我无法分辨它是否需要,所以我应该停止浪费时间:)对吗?
我有一个二进制文件,它是一个简单的有符号32位ieee754浮点数的列表.它们没有被任何东西分开,只是一个接一个地出现直到EOF.
我如何读取此文件并将其正确解释为浮点数?
我尝试使用read(4),但它会自动将它们转换为带有ascii编码的字符串.
我也尝试过使用,bytearray但我只需要一次1个字节,而不是一次4个字节.
许多使用IEEE 754双精度的编程语言提供了一个库函数来将这些双精度转换为字符串.例如,C有sprintf,C++有stringstream,Java有Double.toString,等等.
在内部,这些功能是如何实现的?也就是说,他们使用什么算法将double转换为字符串表示,因为它们经常受到程序员选择的精度限制?
谢谢!
所以我知道IEEE 754为非实数的值指定了一些特殊的浮点值.在Java中,铸造这些值的原始int不会不抛出异常像我本来期望.相反,我们有以下内容:
int n;
n = (int)Double.NaN; // n == 0
n = (int)Double.POSITIVE_INFINITY; // n == Integer.MAX_VALUE
n = (int)Double.NEGATIVE_INFINITY; // n == Integer.MIN_VALUE
Run Code Online (Sandbox Code Playgroud)
在这些情况下不抛出异常的理由是什么?这是IEEE标准,还是仅仅是Java设计者的选择?如果这种演员阵容有例外情况,我是否会发现不良后果?