[BACK]Return to round.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

File: [local] / OpenXM_contrib2 / asir2000 / builtin / round.c (download)

Revision 1.4, Tue Feb 8 17:20:56 2005 UTC (19 years, 3 months ago) by saito
Branch: MAIN
CVS Tags: RELEASE_1_2_3, KNOPPIX_2006
Changes since 1.3: +2 -1 lines

add undef INTERVAL

/* $OpenXM: OpenXM_contrib2/asir2000/builtin/round.c,v 1.4 2005/02/08 17:20:56 saito Exp $ */

#undef INTERVAL
#define INTERVAL
#include "ca.h"
#include "parse.h"
#include "interval.h"

void Padd_pinf(),Padd_minf();
void Psub_pinf(),Psub_minf();
void Pmul_pinf(),Pmul_minf();
void Pdiv_pinf(),Pdiv_minf();

struct ftab round_tab[] = {
	{"add_pinf",Padd_pinf,2},
	{"add_minf",Padd_minf,2},
	{"sub_pinf",Psub_pinf,2},
	{"sub_minf",Psub_minf,2},
	{"mul_pinf",Pmul_pinf,2},
	{"mul_minf",Pmul_minf,2},
	{"div_pinf",Pdiv_pinf,2},
	{"div_minf",Pdiv_minf,2},
	{0,0,0},
};

void Padd_pinf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a )
		*rp = b;
	else if ( !b )
		*rp = a;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("add_pinf : invalid argument");
	else {
		FPPLUSINF
		c = BDY(a)+BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Padd_minf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a )
		*rp = b;
	else if ( !b )
		*rp = a;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("add_pinf : invalid argument");
	else {
		FPMINUSINF
		c = BDY(a)+BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Psub_pinf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a ) {
		if ( !b )
			*rp = 0;
		else {
			c = -BDY(b);
			MKReal(c,r);
			*rp = r;
		}
	} else if ( !b )
		*rp = a;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("sub_pinf : invalid argument");
	else {
		FPPLUSINF
		c = BDY(a)-BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Psub_minf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a ) {
		if ( !b )
			*rp = 0;
		else {
			c = -BDY(b);
			MKReal(c,r);
			*rp = r;
		}
	} else if ( !b )
		*rp = a;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("sub_minf : invalid argument");
	else {
		FPMINUSINF
		c = BDY(a)-BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Pmul_pinf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a || !b )
		*rp = 0;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("mul_pinf : invalid argument");
	else {
		FPPLUSINF
		c = BDY(a)*BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Pmul_minf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !a || !b )
		*rp = 0;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("mul_minf : invalid argument");
	else {
		FPMINUSINF
		c = BDY(a)*BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Pdiv_pinf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !b )
		error("div_pinf : division by 0");
	else if ( !a )
		*rp = 0;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("div_pinf : invalid argument");
	else {
		FPPLUSINF
		c = BDY(a)/BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}

void Pdiv_minf(NODE arg,Real *rp)
{
	Real a,b,r;
	double c;

	a = (Real)ARG0(arg);
	b = (Real)ARG1(arg);
	if ( !b )
		error("div_minf : division by 0");
	else if ( !a )
		*rp = 0;
	else if ( NID(a) != N_R || NID(b) != N_R )
		error("div_minf : invalid argument");
	else {
		FPMINUSINF
		c = BDY(a)/BDY(b);
		FPNEAREST
		MKReal(c,r);
		*rp = r;
	}
}