java - 是否有与 frexp 等效的 Java?

标签 java c++ c floating-point math.h

是否有一个 Java 等效的 C/C++ 函数称为 frexp ?如果您不熟悉,frexp 是 defined by Wikipedia “将 float 分解为尾数和指数。”

我正在寻找兼具速度和准确性的实现,但如果我只能选择一个,我宁愿选择准确性。

这是第一个引用中的代码示例。它应该使 frexp 契约(Contract)更清楚一点:

/* frexp example */
#include <stdio.h>
#include <math.h>

int main ()
{
  double param, result;
  int n;

  param = 8.0;
  result = frexp (param , &n);
  printf ("%lf * 2^%d = %f\n", result, n, param);
  return 0;
}

/* Will produce: 0.500000 * 2^4 = 8.000000 */

最佳答案

这个怎么样?

public static class FRexpResult
{
   public int exponent = 0;
   public double mantissa = 0.;
}

public static FRexpResult frexp(double value)
{
   final FRexpResult result = new FRexpResult();
   long bits = Double.doubleToLongBits(value);
   double realMant = 1.;

   // Test for NaN, infinity, and zero.
   if (Double.isNaN(value) || 
       value + value == value || 
       Double.isInfinite(value))
   {
      result.exponent = 0;
      result.mantissa = value;
   }
   else
   {

      boolean neg = (bits < 0);
      int exponent = (int)((bits >> 52) & 0x7ffL);
      long mantissa = bits & 0xfffffffffffffL;

      if(exponent == 0)
      {
         exponent++;
      }
      else
      {
         mantissa = mantissa | (1L<<52);
      }

      // bias the exponent - actually biased by 1023.
      // we are treating the mantissa as m.0 instead of 0.m
      //  so subtract another 52.
      exponent -= 1075;
      realMant = mantissa;

      // normalize
      while(realMant > 1.0) 
      {
         mantissa >>= 1;
         realMant /= 2.;
         exponent++;
      }

      if(neg)
      {
         realMant = realMant * -1;
      }

      result.exponent = exponent;
      result.mantissa = realMant;
   }
   return result;
}

这是从 answer 中“受到启发”或实际上几乎完全相同的复制到类似的 C# 问题。它与位一起工作,然后使尾数成为 1.0 和 0.0 之间的数字。

关于java - 是否有与 frexp 等效的 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552738/

相关文章:

c - 第 N 个元素的数组,尝试从左到右和从右到左添加元素

递增指针会导致内存泄漏吗?

java - 通过短信发送数据[]。转换 iso-8859-1

c++ - SonarQube Visual Studio 2013 C++ 插件

c++ - 确定 Type 是否是模板函数中的指针

C++ ERROR libxml++ 没有这样的文件或目录

java - Android ListView 未显示,但 json 数据存在

java - Java 中 JSONArray 迭代中的数组

java - 以最小成本(时间和空间)的图形表示

c - fatal error : omp. h:没有这样的文件或目录使用 arm-unknown-linux-uclibcgnueabi (crosstool-ng)