Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何将双精度值映射为浮点值?_Java_Algorithm_Floating Point_Bit Manipulation_Double Precision - Fatal编程技术网

在Java中如何将双精度值映射为浮点值?

在Java中如何将双精度值映射为浮点值?,java,algorithm,floating-point,bit-manipulation,double-precision,Java,Algorithm,Floating Point,Bit Manipulation,Double Precision,乍一看,我的问题可能有点奇怪;但将double转换为float值并不是我想要的。因为当您强制转换它时,您就失去了一些与IEEE-754定义的规则相关的精度,并且无法实现双精度值到浮点范围的实际映射;这是无用的。以下表达式可以工作,但当您有大量输入时,它会非常昂贵: float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE); 我可以通过某种位运算将结果近似为上面提到的“mappedVal”来加速同样的计算吗

乍一看,我的问题可能有点奇怪;但将double转换为float值并不是我想要的。因为当您强制转换它时,您就失去了一些与IEEE-754定义的规则相关的精度,并且无法实现双精度值到浮点范围的实际映射;这是无用的。以下表达式可以工作,但当您有大量输入时,它会非常昂贵:

float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE);

我可以通过某种位运算将结果近似为上面提到的“mappedVal”来加速同样的计算吗?

我不确定您想要实现什么,因为有些双精度值远远超出浮点范围

但是,如果您愿意冒失去对浮动来说太大的价值的风险,请尝试以下方法:

float f = new Double(val).floatValue();

编辑:这与铸造到浮动完全相同。:)

这将双精度值映射到具有相同最高32位的浮点:

float mappedVal = Float.intBitsToFloat((int)(Double.doubleToLongBits(val)>>32));

这个运算的算术解释有点复杂,指数的一部分被映射到尾数…

请给出输入和输出数据的例子。你说,因为根据IEEE-754,强制转换失去了精度,所以它是无用的。然后你问关于“近似结果”的逐位运算?如果你想要一个近似值,就投它吧。只是猜测,但我认为它会被忽略。例如,每当您有一个大于MAX_FLOAT值的double值,并通过运行类似“FLOAT-mappValue=(FLOAT)myDoubleValue;”的指令来强制转换它时;它近似于最大浮点数;i、 e.它完全等于最大浮点数。这不是一个映射;但只是一个近似值。
float
值不能表示与
double
值相同的所有值。这在数学上是不可能的,因为
float
的位更少。因此,您必须丢失信息。许多转换在理论上是可能的。有些会在特定范围内保持精度,但在特定范围外非常不准确;有些会变换动态范围,但会损失很多精度,等等。要得到答案,您必须指定所需转换的特征。您认为这足够快吗?而不是在ALU上进行乘法和除法运算;它使用了一些优雅的解决方案,比如使用双精度位将其转换为浮点值?实际上,我检查了Java源代码,这与转换为浮点值完全相同。Owww:(那么就不用映射了……无论如何;非常感谢您关注我的问题。我似乎应该围绕IEEE-754双精度和浮点值表示法来找出一种方法,将双精度值映射到[MIN_float_value,MAX_float_value]的范围内。)以一种快速有效的方式…就像我说的,我真的不明白你想要实现什么。通过将64位值填充到32位中,在许多情况下,你会遇到精度损失,或者只是有一个对于浮点变量来说太大的值。就像mjuarez所说的,casting可能是你能得到的最接近的值。非常奇妙:)…如果它真的将一个双值映射到浮点类型的范围,这真的很好,我正在寻找。真的非常感谢。我会尝试一下,让你知道我真正得到了什么输出。当我将结果与我在帖子中写的第一个等式中得到的结果进行比较时,它们似乎彼此不相等。另一方面r手,它计算出一些合理的值。那么你所说的背后的逻辑是什么?我使用的公式是:float mappedValue=(float)(doubleValue*MAX\u float\u VALUE+1)/MAX_DOUBLE_VALUE;并且结果在量级上与您的结果完全不同。此映射基于浮点数的二进制表示:它保留最高有效位,并抛出最低有效位。由于float和DOUBLE之间的指数位数不同,您将看到量级上的巨大差异。Aaaa、 我想,我明白你的意思。给我一些时间做一些实验,然后我可以告诉你更多关于你的解决方案对我的问题的影响。除此之外,谢谢你对我的问题感兴趣。