version 1.2, 2000/09/23 15:47:07
|
version 1.6, 2006/10/22 20:45:34
|
Line 1
|
Line 1
|
/* some routines for double-cell arithmetic |
/* some routines for double-cell arithmetic |
only used if BUGGY_LONG_LONG |
only used if BUGGY_LONG_LONG |
|
|
Copyright (C) 1996 Free Software Foundation, Inc. |
Copyright (C) 1996,2000,2003 Free Software Foundation, Inc. |
* Copyright (C) 1995 Dirk Uwe Zoller |
* Copyright (C) 1995 Dirk Uwe Zoller |
* |
* |
* This library is free software; you can redistribute it and/or |
* This library is free software; you can redistribute it and/or |
Line 81 UDCell umdiv (UDCell u, UCell v)
|
Line 81 UDCell umdiv (UDCell u, UCell v)
|
UCell q = 0, h = u.hi, l = u.lo; |
UCell q = 0, h = u.hi, l = u.lo; |
UDCell res; |
UDCell res; |
|
|
|
if (v==0) |
|
throw(BALL_DIVZERO); |
|
if (h>=v) |
|
throw(BALL_RESULTRANGE); |
for (;;) |
for (;;) |
{ |
{ |
if (c || h >= v) |
if (c || h >= v) |
Line 112 DCell smdiv (DCell num, Cell denom) /* s
|
Line 116 DCell smdiv (DCell num, Cell denom) /* s
|
if (denomsign < 0) |
if (denomsign < 0) |
denom = -denom; |
denom = -denom; |
res = UD2D(umdiv (D2UD(num), denom)); |
res = UD2D(umdiv (D2UD(num), denom)); |
if ((numsign^denomsign)<0) |
if (res.lo > (UCell)CELL_MIN) |
|
throw(BALL_RESULTRANGE); |
|
if ((numsign^denomsign)<0) { |
res.lo = -res.lo; |
res.lo = -res.lo; |
|
} else { |
|
if (res.lo == CELL_MIN) |
|
throw(BALL_RESULTRANGE); |
|
} |
if (numsign<0) |
if (numsign<0) |
res.hi = -res.hi; |
res.hi = -res.hi; |
return res; |
return res; |
Line 124 DCell fmdiv (DCell num, Cell denom) /* f
|
Line 134 DCell fmdiv (DCell num, Cell denom) /* f
|
/* I have this technique from Andrew Haley */ |
/* I have this technique from Andrew Haley */ |
DCell res; |
DCell res; |
Cell denomsign=denom; |
Cell denomsign=denom; |
|
Cell numsign; |
|
|
if (denom < 0) { |
if (denom < 0) { |
denom = -denom; |
denom = -denom; |
num = dnegate(num); |
num = dnegate(num); |
} |
} |
if (num.hi < 0) |
numsign = num.hi; |
|
if (numsign < 0) |
num.hi += denom; |
num.hi += denom; |
res = UD2D(umdiv(D2UD(num),denom)); |
res = UD2D(umdiv(D2UD(num),denom)); |
|
if (numsign < 0) { |
|
if (res.lo < (UCell)CELL_MIN) |
|
throw(BALL_RESULTRANGE); |
|
} else { |
|
if (res.lo >= (UCell)CELL_MIN) |
|
throw(BALL_RESULTRANGE); |
|
} |
if (denomsign<0) |
if (denomsign<0) |
res.hi = -res.hi; |
res.hi = -res.hi; |
return res; |
return res; |