From 66a2cc66d7504c9b64e1c461e62ad2a9d964fa95 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 23 Jul 2005 16:19:41 +0000 Subject: Initial revision Subversion-branch: /trunk/chocolate-doom Subversion-revision: 4 --- src/m_fixed.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/m_fixed.c (limited to 'src/m_fixed.c') diff --git a/src/m_fixed.c b/src/m_fixed.c new file mode 100644 index 00000000..ac6e04bc --- /dev/null +++ b/src/m_fixed.c @@ -0,0 +1,90 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// $Id: m_fixed.c 4 2005-07-23 16:19:41Z fraggle $ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// +// $Log$ +// Revision 1.1 2005/07/23 16:19:54 fraggle +// Initial revision +// +// +// DESCRIPTION: +// Fixed point implementation. +// +//----------------------------------------------------------------------------- + + +static const char +rcsid[] = "$Id: m_fixed.c 4 2005-07-23 16:19:41Z fraggle $"; + +#include "stdlib.h" + +#include "doomtype.h" +#include "i_system.h" + +#ifdef __GNUG__ +#pragma implementation "m_fixed.h" +#endif +#include "m_fixed.h" + + + + +// Fixme. __USE_C_FIXED__ or something. + +fixed_t +FixedMul +( fixed_t a, + fixed_t b ) +{ + return ((long long) a * (long long) b) >> FRACBITS; +} + + + +// +// FixedDiv, C version. +// + +fixed_t +FixedDiv +( fixed_t a, + fixed_t b ) +{ + if ( (abs(a)>>14) >= abs(b)) + return (a^b)<0 ? MININT : MAXINT; + return FixedDiv2 (a,b); +} + + + +fixed_t +FixedDiv2 +( fixed_t a, + fixed_t b ) +{ +#if 0 + long long c; + c = ((long long)a<<16) / ((long long)b); + return (fixed_t) c; +#endif + + double c; + + c = ((double)a) / ((double)b) * FRACUNIT; + + if (c >= 2147483648.0 || c < -2147483648.0) + I_Error("FixedDiv: divide by zero"); + return (fixed_t) c; +} -- cgit v1.2.3