fp.c
来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· C语言 代码 · 共 249 行
C
249 行
/* * fp.c * * Floating point routines * * Copyright (c) 1999 * Transvirtual Technologies, Inc. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "config-hacks.h"#include <math.h>#include "gtypes.h"#include "defs.h"#include "files.h"#include "fp.h"/* * Convert double to jlong. * * If you change this function, also change strtod("-0.0") check in * configure.in. */jlongdoubleToLong(jdouble val){ jvalue d; d.d = val;#if defined(DOUBLE_ORDER_OPPOSITE) { /* swap low and high word */ uint32 r = *(uint32*)&d.j; uint32 *s = (uint32*)&d.j + 1; d.i = *s; *s = r; }#endif return d.j;}/* * Convert jlong to double. */jdoublelongToDouble(jlong val){ jvalue d; /* Force all possible NaN values into the canonical NaN value */ if ((val & DEXPMASK) == DEXPMASK && (val & DMANMASK) != 0) val = DNANBITS; /* Convert value */ d.j = val;#if defined(DOUBLE_ORDER_OPPOSITE) { /* swap low and high word */ uint32 r = *(uint32*)&d.j; uint32 *s = (uint32*)&d.j + 1; d.i = *s; *s = r; }#endif return d.d;}/* * Convert float to int. */jintfloatToInt(jfloat val){ jvalue d; d.f = val; return d.i;}/* * Convert int to float. */floatintToFloat(jint val){ jvalue d; /* Force all possible NaN values into the canonical NaN value */ if ((val & FEXPMASK) == FEXPMASK && (val & FMANMASK) != 0) val = FNANBITS; /* Convert value */ d.i = val; return d.f;}/* * Add doubles accoring to Java rules */jdoubledoubleAdd(jdouble v1, jdouble v2){ jlong v1bits, v2bits; v1bits = doubleToLong(v1); v2bits = doubleToLong(v2); if (DISNAN(v1bits) || DISNAN(v2bits)) { return longToDouble(DNANBITS); } return (v1 + v2);}/* * Add floats accoring to Java rules */jfloatfloatAdd(jfloat v1, jfloat v2){ jint v1bits, v2bits; v1bits = floatToInt(v1); v2bits = floatToInt(v2); if (FISNAN(v1bits) || FISNAN(v2bits)) { return intToFloat(FNANBITS); } return (v1 + v2);}/* * Substract doubles accoring to Java rules */jdoubledoubleSubtract(jdouble v1, jdouble v2){ jlong v1bits, v2bits; v1bits = doubleToLong(v1); v2bits = doubleToLong(v2); if (DISNAN(v1bits) || DISNAN(v2bits)) { return longToDouble(DNANBITS); } return (v1 - v2);}/* * Subtract floats accoring to Java rules */jfloatfloatSubtract(jfloat v1, jfloat v2){ jint v1bits, v2bits; v1bits = floatToInt(v1); v2bits = floatToInt(v2); if (FISNAN(v1bits) || FISNAN(v2bits)) { return intToFloat(FNANBITS); } return (v1 - v2);}/* * Multiply doubles accoring to Java rules */jdoubledoubleMultiply(jdouble v1, jdouble v2){ jlong v1bits, v2bits; v1bits = doubleToLong(v1); v2bits = doubleToLong(v2); if (DISNAN(v1bits) || DISNAN(v2bits)) { return longToDouble(DNANBITS); } return (v1 * v2);}/* * Multiply floats accoring to Java rules */jfloatfloatMultiply(jfloat v1, jfloat v2){ jint v1bits, v2bits; v1bits = floatToInt(v1); v2bits = floatToInt(v2); if (FISNAN(v1bits) || FISNAN(v2bits)) { return intToFloat(FNANBITS); } return (v1 * v2);}/* * Divide doubles accoring to Java rules */jdoubledoubleDivide(jdouble v1, jdouble v2){ jlong v1bits, v2bits; v1bits = doubleToLong(v1); v2bits = doubleToLong(v2); if (DISNAN(v1bits) || DISNAN(v2bits)) { return longToDouble(DNANBITS); } if (v2 != 0.0) { return (v1 / v2); } if (v1 == 0.0) { return longToDouble(DNANBITS); } return longToDouble(DINFBITS | ((v1bits ^ v2bits) & DSIGNBIT));}/* * Divide floats accoring to Java rules */jfloatfloatDivide(jfloat v1, jfloat v2){ jint v1bits, v2bits; v1bits = floatToInt(v1); v2bits = floatToInt(v2); if (FISNAN(v1bits) || FISNAN(v2bits)) { return intToFloat(FNANBITS); } if (v2 != 0.0) { return (v1 / v2); } if (v1 == 0.0) { return intToFloat(FNANBITS); } return intToFloat(FINFBITS | ((v1bits ^ v2bits) & FSIGNBIT));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?