gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:20 25 4
gpt4 key购买 nike

是否有一个 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/

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