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 + -
显示快捷键?