java - C 逼近函数

标签 java c java-native-interface

我正在用 C for java 为 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;
}

最佳答案

乍一看,语法看起来是正确的(尽管编译器会比我们更快地告诉您)。

但是,您对它们所做的事情看起来非常严峻。将 double 重新解释为 int 是平台相关的(考虑字节顺序和 sizeof 问题),并且也会违反“严格别名”规则。

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

相关文章:

c - strlen不能返回正确的长度

C/C++ 'continue' 等价于 VB6

java - Java 方法在抛出异常时返回给 JNI 调用者的是什么?

Java 和 C++ 共享内存

opencv - 将 Mat 数组从 jni 返回到 java

关于创建新局部变量以引用类成员变量的 Java 编码风格

java - SOAP 属性总是以相同的顺序出现吗?

Java - 如果 setEditable(false) 则无法向下滚动 JTextArea

java - 这段代码的作用是什么(曾经见过没有引用变量的对象吗?稍后在没有引用变量的情况下调用该对象怎么样?)?

计算圆形数量级