C近似函数

Sha*_*mez 0 c java java-native-interface

我正在为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;
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 5

一目了然,语法看起来是正确的(虽然编译器会告诉你比我们更快).

但是,你在做什么看起来非常严峻.doubleints 重新解释为依赖于平台(思考字节序和sizeof问题),并且还会违反"严格别名"规则.

  • 我会用一些积极的编译时断言来保护所有这样的代码,这些断言验证目标浮点数具有它们所依赖的表示.那些可怕的大卫将警告未来的代码审查人员,这是神奇的,你确实想到了魔法将在哪里生效.请记住,审稿人可能是你,五年后.此外,一些评论中的内容指向可解释其工作原理和原因的参考文献.你未来的自我将不太可能想要时间旅行以这种方式击败你的感觉;-) (3认同)