Merge pull request #9 from kernigh/fix-flt-trek
fixes for floating point and startrek
This commit is contained in:
commit
07113c069b
17 changed files with 185 additions and 177 deletions
examples
lang/cem/libcc.ansi
modules/src/flt_arith
|
@ -107,7 +107,7 @@ void phaser_control(void);
|
||||||
void photon_torpedoes(void);
|
void photon_torpedoes(void);
|
||||||
void torpedo_hit(void);
|
void torpedo_hit(void);
|
||||||
void damage_control(void);
|
void damage_control(void);
|
||||||
void sheild_control(void);
|
void shield_control(void);
|
||||||
void library_computer(void);
|
void library_computer(void);
|
||||||
void galactic_record(void);
|
void galactic_record(void);
|
||||||
void status_report(void);
|
void status_report(void);
|
||||||
|
@ -137,7 +137,7 @@ void sub2(void);
|
||||||
void showfile(char *filename);
|
void showfile(char *filename);
|
||||||
int openfile(char * sFilename, char * sMode);
|
int openfile(char * sFilename, char * sMode);
|
||||||
void closefile(void);
|
void closefile(void);
|
||||||
int getline(char *s);
|
int get_line(char *s);
|
||||||
void randomize(void);
|
void randomize(void);
|
||||||
int get_rand(int iSpread);
|
int get_rand(int iSpread);
|
||||||
double rnd(void);
|
double rnd(void);
|
||||||
|
@ -203,7 +203,7 @@ void
|
||||||
reads(char* buffer)
|
reads(char* buffer)
|
||||||
{
|
{
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
gets(buffer);
|
fgets(buffer, sizeof(string), stdin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main Program */
|
/* Main Program */
|
||||||
|
@ -292,7 +292,7 @@ new_game(void)
|
||||||
else if (! strncmp(sTemp, "tor", 3))
|
else if (! strncmp(sTemp, "tor", 3))
|
||||||
photon_torpedoes();
|
photon_torpedoes();
|
||||||
else if (! strncmp(sTemp, "she", 3))
|
else if (! strncmp(sTemp, "she", 3))
|
||||||
sheild_control();
|
shield_control();
|
||||||
else if (! strncmp(sTemp, "dam", 3))
|
else if (! strncmp(sTemp, "dam", 3))
|
||||||
damage_control();
|
damage_control();
|
||||||
else if (! strncmp(sTemp, "com", 3))
|
else if (! strncmp(sTemp, "com", 3))
|
||||||
|
@ -307,7 +307,7 @@ new_game(void)
|
||||||
printf(" lrs - Long Range Sensors\n");
|
printf(" lrs - Long Range Sensors\n");
|
||||||
printf(" pha - Phasers\n");
|
printf(" pha - Phasers\n");
|
||||||
printf(" tor - Photon Torpedoes\n");
|
printf(" tor - Photon Torpedoes\n");
|
||||||
printf(" she - Sheild Control\n");
|
printf(" she - Shield Control\n");
|
||||||
printf(" dam - Damage Control\n");
|
printf(" dam - Damage Control\n");
|
||||||
printf(" com - Library Computer\n");
|
printf(" com - Library Computer\n");
|
||||||
printf(" xxx - Resign Command\n");
|
printf(" xxx - Resign Command\n");
|
||||||
|
@ -1206,14 +1206,14 @@ damage_control(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sheild_control(void)
|
shield_control(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
string sTemp;
|
string sTemp;
|
||||||
|
|
||||||
if (d[7] < 0.0)
|
if (d[7] < 0.0)
|
||||||
{
|
{
|
||||||
printf("Sheild Control inoperable\n");
|
printf("Shield Control inoperable\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1229,15 +1229,15 @@ sheild_control(void)
|
||||||
|
|
||||||
if (i < 0 || s == i)
|
if (i < 0 || s == i)
|
||||||
{
|
{
|
||||||
printf("<Sheilds Unchanged>\n\n");
|
printf("<Shields Unchanged>\n\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= e + s)
|
if (i >= e + s)
|
||||||
{
|
{
|
||||||
printf("Sheild Control Reports:\n");
|
printf("Shield Control Reports:\n");
|
||||||
printf(" 'This is not the Federation Treasury.'\n");
|
printf(" 'This is not the Federation Treasury.'\n");
|
||||||
printf("<Sheilds Unchanged>\n\n");
|
printf("<Shields Unchanged>\n\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1776,7 +1776,7 @@ get_device_name(void)
|
||||||
{
|
{
|
||||||
static char * device_name[] = {
|
static char * device_name[] = {
|
||||||
"", "Warp Engines","Short Range Sensors","Long Range Sensors",
|
"", "Warp Engines","Short Range Sensors","Long Range Sensors",
|
||||||
"Phaser Control","Photon Tubes","Damage Control","Sheild Control",
|
"Phaser Control","Photon Tubes","Damage Control","Shield Control",
|
||||||
"Library-Computer"};
|
"Library-Computer"};
|
||||||
|
|
||||||
if (r1 < 0 || r1 > 8)
|
if (r1 < 0 || r1 > 8)
|
||||||
|
@ -1888,7 +1888,7 @@ showfile(char *filename)
|
||||||
if (openfile(filename, "r") != 0)
|
if (openfile(filename, "r") != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (getline(lBuffer) != 0)
|
while (get_line(lBuffer) != 0)
|
||||||
{
|
{
|
||||||
printf(lBuffer);
|
printf(lBuffer);
|
||||||
|
|
||||||
|
@ -1926,7 +1926,7 @@ closefile(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
getline(char *s)
|
get_line(char *s)
|
||||||
{
|
{
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (fgets(s, MAXCOL, stream) == NULL)
|
if (fgets(s, MAXCOL, stream) == NULL)
|
||||||
|
|
|
@ -28,9 +28,9 @@ normalrule {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, plat in ipairs(vars.plats) do
|
for _, plat in ipairs(vars.plats) do
|
||||||
acklibrary {
|
acklibrary {
|
||||||
name = "lib_"..plat,
|
name = "lib_"..plat,
|
||||||
srcs = {
|
srcs = {
|
||||||
"+ctype_files",
|
"+ctype_files",
|
||||||
"+ctype_tab",
|
"+ctype_tab",
|
||||||
"./ctype/*.c",
|
"./ctype/*.c",
|
||||||
|
@ -43,20 +43,24 @@ for _, plat in ipairs(vars.plats) do
|
||||||
"./setjmp/*.c",
|
"./setjmp/*.c",
|
||||||
"./setjmp/*.e",
|
"./setjmp/*.e",
|
||||||
"./signal/*.c",
|
"./signal/*.c",
|
||||||
"./assert/*.c",
|
"./assert/*.c",
|
||||||
"./stdio/*.c",
|
"./stdio/*.c",
|
||||||
"./stdlib/*.c",
|
"./stdlib/*.c",
|
||||||
"./string/*.c",
|
"./string/*.c",
|
||||||
"./time/*.c",
|
"./time/*.c",
|
||||||
|
},
|
||||||
},
|
|
||||||
hdrs = {}, -- must be empty
|
hdrs = {}, -- must be empty
|
||||||
deps = {
|
deps = {
|
||||||
"lang/cem/libcc.ansi/headers+headers",
|
"lang/cem/libcc.ansi/headers+headers",
|
||||||
"plat/"..plat.."/include+headers",
|
"plat/"..plat.."/include+headers",
|
||||||
|
"./malloc/malloc.h",
|
||||||
|
"./math/localmath.h",
|
||||||
|
"./stdio/loc_incl.h",
|
||||||
|
"./stdlib/ext_fmt.h",
|
||||||
|
"./time/loc_time.h",
|
||||||
},
|
},
|
||||||
vars = { plat = plat }
|
vars = { plat = plat }
|
||||||
}
|
}
|
||||||
|
|
||||||
ackfile {
|
ackfile {
|
||||||
name = "crt_"..plat,
|
name = "crt_"..plat,
|
||||||
|
|
|
@ -1,43 +1,79 @@
|
||||||
/*
|
/*
|
||||||
<float.h> -- simple version used by "gimplify"
|
* float.h - implementation limits
|
||||||
|
*/
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
last edit: 2007-02-12 D A Gwyn
|
#if !defined(_FLOAT_H)
|
||||||
*/
|
#define _FLOAT_H
|
||||||
|
|
||||||
/* Does not exactly fit any model, and is minimal for "universality". */
|
#if defined(__vax) || defined(__pdp)
|
||||||
|
#define FLT_DIG 6
|
||||||
|
#define FLT_EPSILON 5.96046448e-08F
|
||||||
|
#define FLT_MANT_DIG 8
|
||||||
|
#define FLT_MAX 1.70141173e+38F
|
||||||
|
#define FLT_MAX_10_EXP 38
|
||||||
|
#define FLT_MAX_EXP 127
|
||||||
|
#define FLT_MIN 2.93873588e-39F
|
||||||
|
#define FLT_MIN_10_EXP (-38)
|
||||||
|
#define FLT_MIN_EXP (-127)
|
||||||
|
|
||||||
#define FLT_ROUNDS (-1)
|
#define DBL_DIG 16
|
||||||
#define FLT_EVAL_METHOD (-1)
|
#define DBL_EPSILON 1.38777878078144568e-17
|
||||||
#define FLT_RADIX 2
|
#define DBL_MANT_DIG 8
|
||||||
#define DECIMAL_DIG 10
|
#define DBL_MAX 1.70141183460469229e+38
|
||||||
|
#define DBL_MAX_10_EXP 38
|
||||||
|
#define DBL_MAX_EXP 127
|
||||||
|
#define DBL_MIN 2.93873587705571877e-39
|
||||||
|
#define DBL_MIN_10_EXP (-38)
|
||||||
|
#define DBL_MIN_EXP (-127)
|
||||||
|
|
||||||
/* assumes that "gimplify" specifies "-Dfloat=double" */
|
#define LDBL_DIG 16
|
||||||
#define FLT_MANT_DIG 10
|
#define LDBL_EPSILON 1.38777878078144568e-17L
|
||||||
#define FLT_EPSILON (1E-9F)
|
#define LDBL_MANT_DIG 8
|
||||||
#define FLT_DIG 10
|
#define LDBL_MAX 1.70141183460469229e+38L
|
||||||
#define FLT_MIN_EXP (-31)
|
#define LDBL_MAX_10_EXP 38
|
||||||
#define FLT_MIN (1E-37F)
|
#define LDBL_MAX_EXP 127
|
||||||
#define FLT_MIN_10_EXP (-37)
|
#define LDBL_MIN 2.93873587705571877e-39L
|
||||||
#define FLT_MAX_EXP 37
|
#define LDBL_MIN_10_EXP (-38)
|
||||||
#define FLT_MAX (1E+37F)
|
#define LDBL_MIN_EXP (-127)
|
||||||
#define FLT_MAX_10_EXP 37
|
|
||||||
|
|
||||||
#define DBL_MANT_DIG 10
|
#define FLT_ROUNDS 1
|
||||||
#define DBL_EPSILON (1E-9)
|
#define FLT_RADIX 2
|
||||||
#define DBL_DIG 10
|
|
||||||
#define DBL_MIN_EXP (-31)
|
|
||||||
#define DBL_MIN (1E-37)
|
|
||||||
#define DBL_MIN_10_EXP (-37)
|
|
||||||
#define DBL_MAX_EXP 37
|
|
||||||
#define DBL_MAX (1E+37)
|
|
||||||
#define DBL_MAX_10_EXP 37
|
|
||||||
|
|
||||||
#define LDBL_MANT_DIG 10
|
#else /* IEEE format */
|
||||||
#define LDBL_EPSILON (1E-9L)
|
#define FLT_DIG 6
|
||||||
#define LDBL_DIG 10
|
#define FLT_EPSILON 1.19209290e-07F
|
||||||
#define LDBL_MIN_EXP (-31)
|
#define FLT_MANT_DIG 24
|
||||||
#define LDBL_MIN (1E-37L)
|
#define FLT_MAX 3.40282347e+38F
|
||||||
#define LDBL_MIN_10_EXP (-37)
|
#define FLT_MAX_10_EXP 38
|
||||||
#define LDBL_MAX_EXP 37
|
#define FLT_MAX_EXP 128
|
||||||
#define LDBL_MAX (1E+37L)
|
#define FLT_MIN 1.17549435e-38F
|
||||||
#define LDBL_MAX_10_EXP 37
|
#define FLT_MIN_10_EXP (-37)
|
||||||
|
#define FLT_MIN_EXP (-125)
|
||||||
|
|
||||||
|
#define DBL_DIG 15
|
||||||
|
#define DBL_EPSILON 2.2204460492503131e-16
|
||||||
|
#define DBL_MANT_DIG 53
|
||||||
|
#define DBL_MAX 1.7976931348623157e+308
|
||||||
|
#define DBL_MAX_10_EXP 308
|
||||||
|
#define DBL_MAX_EXP 1024
|
||||||
|
#define DBL_MIN 2.2250738585072014e-308
|
||||||
|
#define DBL_MIN_10_EXP (-307)
|
||||||
|
#define DBL_MIN_EXP (-1021)
|
||||||
|
|
||||||
|
#define LDBL_DIG 15
|
||||||
|
#define LDBL_EPSILON 2.2204460492503131e-16L
|
||||||
|
#define LDBL_MANT_DIG 53
|
||||||
|
#define LDBL_MAX 1.7976931348623157e+308L
|
||||||
|
#define LDBL_MAX_10_EXP 308
|
||||||
|
#define LDBL_MAX_EXP 1024
|
||||||
|
#define LDBL_MIN 2.2250738585072014e-308L
|
||||||
|
#define LDBL_MIN_10_EXP (-307)
|
||||||
|
#define LDBL_MIN_EXP (-1021)
|
||||||
|
|
||||||
|
#define FLT_ROUNDS 1
|
||||||
|
#define FLT_RADIX 2
|
||||||
|
|
||||||
|
#endif /* vax, pdp or ieee */
|
||||||
|
|
||||||
|
#endif /* _FLOAT_H */
|
||||||
|
|
|
@ -18,18 +18,5 @@
|
||||||
#define POLYNOM12(x, a) (POLYNOM11((x),(a)+1)*(x)+(a)[0])
|
#define POLYNOM12(x, a) (POLYNOM11((x),(a)+1)*(x)+(a)[0])
|
||||||
#define POLYNOM13(x, a) (POLYNOM12((x),(a)+1)*(x)+(a)[0])
|
#define POLYNOM13(x, a) (POLYNOM12((x),(a)+1)*(x)+(a)[0])
|
||||||
|
|
||||||
/* These are set up for 64-bit doubles. */
|
#define M_LN_MAX_D (M_LN2 * DBL_MAX_EXP)
|
||||||
|
#define M_LN_MIN_D (M_LN2 * (DBL_MIN_EXP - 1))
|
||||||
#ifndef M_MAX_D
|
|
||||||
#define M_MAX_D 1.7976931348623157e+308
|
|
||||||
#define M_MIN_D 2.2250738585072014e-308
|
|
||||||
#define M_DEXPLEN 11
|
|
||||||
#endif
|
|
||||||
#define M_DMAXEXP ((1 << (M_DEXPLEN - 1)) - 1)
|
|
||||||
#define M_DMINEXP (-M_DMAXEXP)
|
|
||||||
#define M_LN_MAX_D (M_LN2 * M_DMAXEXP)
|
|
||||||
#define M_LN_MIN_D (M_LN2 * (M_DMINEXP - 1))
|
|
||||||
|
|
||||||
#define HUGE M_MAX_D
|
|
||||||
#define MAXDOUBLE M_MAX_D
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include "flt_misc.h"
|
#include "flt_misc.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -15,16 +16,15 @@ flt_b64_add(e1,e2)
|
||||||
int carry;
|
int carry;
|
||||||
|
|
||||||
/* add higher pair of 32 bits */
|
/* add higher pair of 32 bits */
|
||||||
overflow = ucmp((long)0xFFFFFFFF - e1->flt_h_32, e2->flt_h_32) < 0;
|
overflow = (0xFFFFFFFFUL - e1->flt_h_32 < e2->flt_h_32);
|
||||||
e1->flt_h_32 += e2->flt_h_32;
|
e1->flt_h_32 += e2->flt_h_32;
|
||||||
|
|
||||||
/* add lower pair of 32 bits */
|
/* add lower pair of 32 bits */
|
||||||
carry = ucmp((long)0xFFFFFFFF - e1->flt_l_32, e2->flt_l_32) < 0;
|
carry = (0xFFFFFFFFUL - e1->flt_l_32 < e2->flt_l_32);
|
||||||
e1->flt_l_32 += e2->flt_l_32;
|
e1->flt_l_32 += e2->flt_l_32;
|
||||||
|
|
||||||
if ((carry) && ((++e1->flt_h_32 &~0xFFFFFFFF) || e1->flt_h_32 == 0)) {
|
if ((carry) && (++e1->flt_h_32 == 0))
|
||||||
e1->flt_h_32 = 0;
|
|
||||||
return(1); /* had a 64 bit overflow */
|
return(1); /* had a 64 bit overflow */
|
||||||
}
|
|
||||||
return(overflow); /* return status from higher add */
|
return(overflow); /* return status from higher add */
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,12 +23,10 @@ flt_b64_sft(e,n)
|
||||||
n -= 32;
|
n -= 32;
|
||||||
}
|
}
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
e->flt_l_32 = (e->flt_l_32 >> 1) & 0x7FFFFFFF;
|
e->flt_l_32 >>= n;
|
||||||
e->flt_l_32 >>= (n - 1);
|
|
||||||
if (e->flt_h_32 != 0) {
|
if (e->flt_h_32 != 0) {
|
||||||
e->flt_l_32 |= (e->flt_h_32 << (32 - n)) & 0xFFFFFFFF;
|
e->flt_l_32 |= (e->flt_h_32 << (32 - n));
|
||||||
e->flt_h_32 = (e->flt_h_32 >> 1) & 0x7FFFFFFF;
|
e->flt_h_32 >>= n;
|
||||||
e->flt_h_32 >>= (n - 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n = -n;
|
n = -n;
|
||||||
|
@ -38,11 +36,10 @@ flt_b64_sft(e,n)
|
||||||
n -= 32;
|
n -= 32;
|
||||||
}
|
}
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
e->flt_h_32 = (e->flt_h_32 << n) & 0xFFFFFFFF;
|
e->flt_h_32 <<= n;
|
||||||
if (e->flt_l_32 != 0) {
|
if (e->flt_l_32 != 0) {
|
||||||
long l = (e->flt_l_32 >> 1) & 0x7FFFFFFF;
|
e->flt_h_32 |= (e->flt_l_32 >> (32 - n));
|
||||||
e->flt_h_32 |= (l >> (31 - n));
|
e->flt_l_32 <<= n;
|
||||||
e->flt_l_32 = (e->flt_l_32 << n) & 0xFFFFFFFF;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ clibrary {
|
||||||
"./flt_umin.c",
|
"./flt_umin.c",
|
||||||
"./flt_chk.c",
|
"./flt_chk.c",
|
||||||
"./split.c",
|
"./split.c",
|
||||||
"./ucmp.c",
|
|
||||||
},
|
},
|
||||||
hdrs = { "./flt_arith.h" },
|
hdrs = { "./flt_arith.h" },
|
||||||
deps = {
|
deps = {
|
||||||
|
@ -24,4 +23,18 @@ clibrary {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- The test program isn't built by default. Here is a target
|
||||||
|
-- modules/src/flt_arith+pkg to install it as flt_test
|
||||||
|
|
||||||
|
cprogram {
|
||||||
|
name = "test",
|
||||||
|
srcs = { "./test.c" },
|
||||||
|
deps = { "+lib" },
|
||||||
|
}
|
||||||
|
|
||||||
|
installable {
|
||||||
|
name = "pkg",
|
||||||
|
map = {
|
||||||
|
["$(INSDIR)/bin/flt_test"] = "+test",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
|
@ -44,11 +44,10 @@ flt_add(e1,e2,e3)
|
||||||
}
|
}
|
||||||
if (e1->flt_sign != e2->flt_sign) {
|
if (e1->flt_sign != e2->flt_sign) {
|
||||||
/* e2 + e1 = e2 - (-e1) */
|
/* e2 + e1 = e2 - (-e1) */
|
||||||
int tmp = ucmp(e1->m1, e2->m1);
|
if (e1->m1 > e2->m1 ||
|
||||||
int tmp2 = ucmp(e1->m2, e2->m2);
|
(e1->m1 == e2->m1 && e1->m2 > e2->m2)) {
|
||||||
if (tmp > 0 || (tmp == 0 && tmp2 > 0)) {
|
|
||||||
/* abs(e1) > abs(e2) */
|
/* abs(e1) > abs(e2) */
|
||||||
if (tmp2 < 0) {
|
if (e1->m2 < e2->m2) {
|
||||||
e1->m1 -= 1; /* carry in */
|
e1->m1 -= 1; /* carry in */
|
||||||
}
|
}
|
||||||
e1->m1 -= e2->m1;
|
e1->m1 -= e2->m1;
|
||||||
|
@ -56,7 +55,7 @@ flt_add(e1,e2,e3)
|
||||||
*e3 = *e1;
|
*e3 = *e1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (tmp2 > 0)
|
if (e1->m2 > e2->m2)
|
||||||
e2->m1 -= 1; /* carry in */
|
e2->m1 -= 1; /* carry in */
|
||||||
e2->m1 -= e1->m1;
|
e2->m1 -= e1->m1;
|
||||||
e2->m2 -= e1->m2;
|
e2->m2 -= e1->m2;
|
||||||
|
|
|
@ -25,10 +25,9 @@ flt_arith2flt(n, e, uns)
|
||||||
e->m1 = 0; e->m2 = n;
|
e->m1 = 0; e->m2 = n;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
e->m2 = n & 0xffffffffL;
|
/* assuming sizeof(arith) >= 8 */
|
||||||
n >>= 1;
|
e->m1 = n >> 32;
|
||||||
n &= ~((arith) 1 << (8*sizeof(arith)-1));
|
e->m2 = n;
|
||||||
e->m1 = (n >> 31);
|
|
||||||
}
|
}
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
e->flt_exp = 0;
|
e->flt_exp = 0;
|
||||||
|
|
|
@ -9,8 +9,8 @@ flt_arith \- high precision floating point arithmetic
|
||||||
.if t .ta 3m 13m 22m
|
.if t .ta 3m 13m 22m
|
||||||
.if n .ta 5m 25m 40m
|
.if n .ta 5m 25m 40m
|
||||||
struct flt_mantissa {
|
struct flt_mantissa {
|
||||||
long flt_h_32; /* high order 32 bits of mantissa */
|
uint32_t flt_h_32; /* high order 32 bits of mantissa */
|
||||||
long flt_l_32; /* low order 32 bits of mantissa */
|
uint32_t flt_l_32; /* low order 32 bits of mantissa */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -7,15 +7,15 @@
|
||||||
#ifndef __FLT_INCLUDED__
|
#ifndef __FLT_INCLUDED__
|
||||||
#define __FLT_INCLUDED__
|
#define __FLT_INCLUDED__
|
||||||
|
|
||||||
#include "ansi.h"
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifndef arith
|
#ifndef arith
|
||||||
#define arith long
|
#define arith long
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct flt_mantissa {
|
struct flt_mantissa {
|
||||||
long flt_h_32; /* high order 32 bits of mantissa */
|
uint32_t flt_h_32; /* high order 32 bits of mantissa */
|
||||||
long flt_l_32; /* low order 32 bits of mantissa */
|
uint32_t flt_l_32; /* low order 32 bits of mantissa */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct flt_arith {
|
typedef struct flt_arith {
|
||||||
|
@ -33,17 +33,17 @@ extern int flt_status;
|
||||||
|
|
||||||
#define FLT_STRLEN 32 /* max length of result of flt_flt2str() */
|
#define FLT_STRLEN 32 /* max length of result of flt_flt2str() */
|
||||||
|
|
||||||
_PROTOTYPE(void flt_add, (flt_arith *, flt_arith *, flt_arith *));
|
void flt_add(flt_arith *, flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_sub, (flt_arith *, flt_arith *, flt_arith *));
|
void flt_sub(flt_arith *, flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_mul, (flt_arith *, flt_arith *, flt_arith *));
|
void flt_mul(flt_arith *, flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_div, (flt_arith *, flt_arith *, flt_arith *));
|
void flt_div(flt_arith *, flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_modf, (flt_arith *, flt_arith *, flt_arith *));
|
void flt_modf(flt_arith *, flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(int flt_cmp, (flt_arith *, flt_arith *));
|
int flt_cmp(flt_arith *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_str2flt, (char *, flt_arith *));
|
void flt_str2flt(char *, flt_arith *);
|
||||||
_PROTOTYPE(void flt_flt2str, (flt_arith *, char *, int));
|
void flt_flt2str(flt_arith *, char *, int);
|
||||||
_PROTOTYPE(void flt_arith2flt, (arith, flt_arith *, int));
|
void flt_arith2flt(arith, flt_arith *, int);
|
||||||
_PROTOTYPE(arith flt_flt2arith, (flt_arith *, int));
|
arith flt_flt2arith(flt_arith *, int);
|
||||||
_PROTOTYPE(void flt_b64_sft, (struct flt_mantissa *, int));
|
void flt_b64_sft(struct flt_mantissa *, int);
|
||||||
_PROTOTYPE(void flt_umin, (flt_arith *));
|
void flt_umin(flt_arith *);
|
||||||
|
|
||||||
#endif /* __FLT_INCLUDED__ */
|
#endif /* __FLT_INCLUDED__ */
|
||||||
|
|
|
@ -5,14 +5,15 @@
|
||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include "flt_misc.h"
|
#include "flt_misc.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
flt_div(e1,e2,e3)
|
flt_div(e1,e2,e3)
|
||||||
register flt_arith *e1,*e2,*e3;
|
register flt_arith *e1,*e2,*e3;
|
||||||
{
|
{
|
||||||
long result[2];
|
uint32_t result[2];
|
||||||
register long *lp;
|
register uint32_t *rp;
|
||||||
unsigned short u[9], v[5];
|
unsigned short u[9], v[5];
|
||||||
register int j;
|
register int j;
|
||||||
register unsigned short *u_p = u;
|
register unsigned short *u_p = u;
|
||||||
|
@ -44,7 +45,7 @@ flt_div(e1,e2,e3)
|
||||||
while (! v[maxv]) maxv--;
|
while (! v[maxv]) maxv--;
|
||||||
result[0] = 0;
|
result[0] = 0;
|
||||||
result[1] = 0;
|
result[1] = 0;
|
||||||
lp = result;
|
rp = result;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use an algorithm of Knuth (The art of programming, Seminumerical
|
* Use an algorithm of Knuth (The art of programming, Seminumerical
|
||||||
|
@ -52,35 +53,25 @@ flt_div(e1,e2,e3)
|
||||||
* with base 65536.
|
* with base 65536.
|
||||||
*/
|
*/
|
||||||
for (j = 0; j <= 3; j++, u_p++) {
|
for (j = 0; j <= 3; j++, u_p++) {
|
||||||
long q_est, temp;
|
uint32_t q_est, temp;
|
||||||
long v1 = v[1];
|
|
||||||
|
|
||||||
if (j == 2) lp++;
|
if (j == 2) rp++;
|
||||||
if (u_p[0] == 0 && u_p[1] < v[1]) continue;
|
if (u_p[0] == 0 && u_p[1] < v[1]) continue;
|
||||||
temp = ((long)u_p[0] << 16) + u_p[1];
|
temp = ((uint32_t)u_p[0] << 16) + u_p[1];
|
||||||
if (u_p[0] >= v[1]) {
|
if (u_p[0] >= v[1]) {
|
||||||
q_est = 0x0000FFFFL;
|
q_est = 0x0000FFFFUL;
|
||||||
}
|
}
|
||||||
else if (v[1] == 1) {
|
else if (v[1] == 1) {
|
||||||
q_est = temp;
|
q_est = temp;
|
||||||
}
|
}
|
||||||
else if (temp >= 0) {
|
|
||||||
q_est = temp / v1;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
long rem;
|
q_est = temp / v[1];
|
||||||
q_est = (0x7FFFFFFF/v1)+((temp&0x7FFFFFFF)/v1);
|
|
||||||
rem = (0x7FFFFFFF%v1)+((temp&0x7FFFFFFF)%v1)+1;
|
|
||||||
while (rem >= v1) {
|
|
||||||
q_est++;
|
|
||||||
rem -= v1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
temp -= q_est * v1;
|
temp -= q_est * v[1];
|
||||||
while (!(temp&0xFFFF0000) &&
|
while (!(temp&0xFFFF0000) &&
|
||||||
ucmp((long)v[2]*q_est,(temp<<16)+(long)u_p[2]) > 0) {
|
v[2]*q_est > (temp<<16)+u_p[2]) {
|
||||||
q_est--;
|
q_est--;
|
||||||
temp += v1;
|
temp += v[1];
|
||||||
}
|
}
|
||||||
/* Now, according to Knuth, we have an estimate of the
|
/* Now, according to Knuth, we have an estimate of the
|
||||||
quotient, that is either correct or one too big, but
|
quotient, that is either correct or one too big, but
|
||||||
|
@ -88,11 +79,11 @@ flt_div(e1,e2,e3)
|
||||||
*/
|
*/
|
||||||
if (q_est != 0) {
|
if (q_est != 0) {
|
||||||
int i;
|
int i;
|
||||||
long k = 0;
|
uint32_t k = 0;
|
||||||
int borrow = 0;
|
int borrow = 0;
|
||||||
|
|
||||||
for (i = maxv; i > 0; i--) {
|
for (i = maxv; i > 0; i--) {
|
||||||
long tmp = q_est * (long)v[i] + k + borrow;
|
uint32_t tmp = q_est * v[i] + k + borrow;
|
||||||
unsigned short md = tmp & 0xFFFF;
|
unsigned short md = tmp & 0xFFFF;
|
||||||
|
|
||||||
borrow = (md > u_p[i]);
|
borrow = (md > u_p[i]);
|
||||||
|
@ -100,7 +91,7 @@ flt_div(e1,e2,e3)
|
||||||
k = (tmp >> 16) & 0xFFFF;
|
k = (tmp >> 16) & 0xFFFF;
|
||||||
}
|
}
|
||||||
k += borrow;
|
k += borrow;
|
||||||
borrow = (long)u_p[0] < k;
|
borrow = u_p[0] < k;
|
||||||
u_p[0] -= k;
|
u_p[0] -= k;
|
||||||
|
|
||||||
if (borrow) {
|
if (borrow) {
|
||||||
|
@ -110,15 +101,15 @@ flt_div(e1,e2,e3)
|
||||||
q_est--;
|
q_est--;
|
||||||
borrow = 0;
|
borrow = 0;
|
||||||
for (i = maxv; i > 0; i--) {
|
for (i = maxv; i > 0; i--) {
|
||||||
long tmp
|
uint32_t tmp
|
||||||
= v[i]+(long)u_p[i]+borrow;
|
= v[i]+(uint32_t)u_p[i]+borrow;
|
||||||
|
|
||||||
u_p[i] = tmp & 0xFFFF;
|
u_p[i] = tmp & 0xFFFF;
|
||||||
borrow = (tmp >> 16) & 0xFFFF;
|
borrow = (tmp >> 16) & 0xFFFF;
|
||||||
}
|
}
|
||||||
u_p[0] += borrow;
|
u_p[0] += borrow;
|
||||||
}
|
}
|
||||||
*lp |= (j & 1) ? q_est : (q_est<<16);
|
*rp |= (j & 1) ? q_est : (q_est<<16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e3->m1 = result[0];
|
e3->m1 = result[0];
|
||||||
|
|
|
@ -15,14 +15,12 @@
|
||||||
#define EXT_MIN (-16384) /* min exponent */
|
#define EXT_MIN (-16384) /* min exponent */
|
||||||
|
|
||||||
/* hiding of names: */
|
/* hiding of names: */
|
||||||
#define ucmp _flt_ucmp
|
|
||||||
#define flt_nrm _flt_nrm
|
#define flt_nrm _flt_nrm
|
||||||
#define flt_chk _flt_chk
|
#define flt_chk _flt_chk
|
||||||
#define flt_b64_add _flt_64add
|
#define flt_b64_add _flt_64add
|
||||||
#define flt_split _flt_split
|
#define flt_split _flt_split
|
||||||
|
|
||||||
_PROTOTYPE(int ucmp, (long, long));
|
void flt_nrm(flt_arith *);
|
||||||
_PROTOTYPE(void flt_nrm, (flt_arith *));
|
void flt_chk(flt_arith *);
|
||||||
_PROTOTYPE(void flt_chk, (flt_arith *));
|
int flt_b64_add(struct flt_mantissa *, struct flt_mantissa *);
|
||||||
_PROTOTYPE(int flt_b64_add, (struct flt_mantissa *, struct flt_mantissa *));
|
void flt_split(flt_arith *, unsigned short *);
|
||||||
_PROTOTYPE(void flt_split, (flt_arith *, unsigned short *));
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include "flt_misc.h"
|
#include "flt_misc.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -43,9 +44,9 @@ flt_mul(e1,e2,e3)
|
||||||
*/
|
*/
|
||||||
for(i=4, pres = &result[4];i--;pres--) if (mp[i]) {
|
for(i=4, pres = &result[4];i--;pres--) if (mp[i]) {
|
||||||
unsigned short k = 0;
|
unsigned short k = 0;
|
||||||
long mpi = mp[i];
|
uint32_t mpi = mp[i];
|
||||||
for(j=4;j--;) {
|
for(j=4;j--;) {
|
||||||
long tmp = (long)pres[j] + k;
|
long tmp = (uint32_t)pres[j] + k;
|
||||||
if (mc[j]) tmp += mpi * mc[j];
|
if (mc[j]) tmp += mpi * mc[j];
|
||||||
pres[j] = tmp & 0xFFFF;
|
pres[j] = tmp & 0xFFFF;
|
||||||
k = (tmp >> 16) & 0xFFFF;
|
k = (tmp >> 16) & 0xFFFF;
|
||||||
|
@ -64,12 +65,12 @@ flt_mul(e1,e2,e3)
|
||||||
/*
|
/*
|
||||||
* combine the registers to a total
|
* combine the registers to a total
|
||||||
*/
|
*/
|
||||||
e3->m1 = ((long)result[0] << 16) + result[1];
|
e3->m1 = ((uint32_t)result[0] << 16) + result[1];
|
||||||
e3->m2 = ((long)result[2] << 16) + result[3];
|
e3->m2 = ((uint32_t)result[2] << 16) + result[3];
|
||||||
if (result[4] & 0x8000) {
|
if (result[4] & 0x8000) {
|
||||||
if (++e3->m2 == 0 || (e3->m2 & ~ 0xFFFFFFFF)) {
|
if (++e3->m2 == 0) {
|
||||||
e3->m2 = 0;
|
e3->m2 = 0;
|
||||||
if (++e3->m1 == 0 || (e3->m1 & ~ 0xFFFFFFFF)) {
|
if (++e3->m1 == 0) {
|
||||||
e3->m1 = 0x80000000;
|
e3->m1 = 0x80000000;
|
||||||
e3->flt_exp++;
|
e3->flt_exp++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include "flt_misc.h"
|
#include "flt_misc.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -24,8 +25,8 @@ flt_nrm(e)
|
||||||
e->m2 = 0L;
|
e->m2 = 0L;
|
||||||
e->flt_exp -= 32;
|
e->flt_exp -= 32;
|
||||||
}
|
}
|
||||||
if ((e->m1 & 0x80000000) == 0) {
|
if ((e->m1 & 0x80000000UL) == 0) {
|
||||||
long l = 0x40000000;
|
uint32_t l = 0x40000000UL;
|
||||||
int cnt = -1;
|
int cnt = -1;
|
||||||
|
|
||||||
while (! (l & e->m1)) {
|
while (! (l & e->m1)) {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include "flt_arith.h"
|
#include "flt_arith.h"
|
||||||
|
|
||||||
struct tests {
|
struct tests {
|
||||||
|
@ -22,6 +24,7 @@ struct tests {
|
||||||
{ 0, 0, 0, 0}
|
{ 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
register struct tests *p = tests;
|
register struct tests *p = tests;
|
||||||
|
@ -31,7 +34,7 @@ main()
|
||||||
if (! dotest(p)) exit_status = 1;
|
if (! dotest(p)) exit_status = 1;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
exit(exit_status);
|
return exit_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
(c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* $Id$ */
|
|
||||||
|
|
||||||
#include "flt_misc.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
ucmp(l1,l2)
|
|
||||||
long l1,l2;
|
|
||||||
{
|
|
||||||
if (l1 == l2) return 0;
|
|
||||||
if (l2 >= 0) {
|
|
||||||
if (l1 > l2 || l1 < 0) return 1;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (l1 >= 0 || l1 < l2) return -1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
Loading…
Reference in a new issue