我在C中为EXP、log和SqRT做了一些近似函数。我对指针的工作方式有点生疏--这语法对吗?

#include <math.h>
#include "QDMath.h"

JNIEXPORT jdouble JNICALL Java_QDMath_exp
  (JNIEnv *env, jclass class, jdouble val)
{
    jint tmp = (jint) (1512775 * val + 1072632447);
    jdouble p = 0.0;
    *(1 + (jint * ) &p) = tmp;
    return p;
}

JNIEXPORT jdouble JNICALL Java_QDMath_log
  (JNIEnv *env, jclass class, jdouble val)
{
    jint tmp = (*(1 + (jint *) &val));
    jdouble p = ((jdouble) tmp - 1072632447) / 1512775;
    return p;
}

JNIEXPORT jdouble JNICALL Java_QDMath_sqrt
  (JNIEnv *env, jclass class, jdouble val)
{
    jlong tmp = ((*(jlong *) &val) - 1065353216)>>1;
    return *(jdouble *) &tmp;
}

最佳答案

乍一看,语法看起来是正确的(尽管编译器会比我们更快地告诉您)。
然而,你用它们做的事情看起来很可怕。将doubles重新解释为ints依赖于平台(考虑endianness和sizeof问题),也会违反“严格的别名”规则。

关于java - C近似函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3680305/

10-10 03:24