|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 5526 (0x1596) Types: TextFile Names: »missing.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/microcode/missing.c«
/* -*-C-*- is a horrible language, and Emacs agrees. */ /**************************************************************** * * * Copyright (c) 1986 * * Massachusetts Institute of Technology * * * * This material was developed by the Scheme project at the * * Massachusetts Institute of Technology, Department of * * Electrical Engineering and Computer Science. Permission to * * copy this software, to redistribute it, and to use it for any * * purpose is granted, subject to the following restrictions and * * understandings. * * * * 1. Any copy made of this software must include this copyright * * notice in full. * * * * 2. Users of this software agree to make their best efforts (a)* * to return to the MIT Scheme project any improvements or * * extensions that they make, so that these may be included in * * future releases; and (b) to inform MIT of noteworthy uses of * * this software. * * * * 3. All materials developed as a consequence of the use of * * this software shall duly acknowledge such use, in accordance * * with the usual standards of acknowledging credit in academic * * research. * * * * 4. MIT has made no warrantee or representation that the * * operation of this software will be error-free, and MIT is * * under no obligation to provide any services, by way of * * maintenance, update, or otherwise. * * * * 5. In conjunction with products arising from the use of this * * material, there shall be no use of the name of the * * Massachusetts Institute of Technology nor of any adaptation * * thereof in any advertising, promotional, or sales literature * * without prior written consent from MIT in each case. * * * ****************************************************************/ \f /* File: MISSING.C * This file contains utilities potentially missing from the math library */ #include "config.h" #define boolean int #define false 0 #define true 1 extern double frexp(), ldexp(); static boolean floating_table_initialized = false; static double floating_table[(2*FLONUM_EXPT_SIZE)-1]; static int exponent_table[(2*FLONUM_EXPT_SIZE)-1]; initialize_floating_table() { register int index, exponent; register int *int_table = &exponent_table[FLONUM_EXPT_SIZE-1]; register double *the_table = &floating_table[FLONUM_EXPT_SIZE-1]; register double x; the_table[0] = 1.0; int_table[0] = 0; for (x = 2.0, index = 1, exponent = 1; index < FLONUM_EXPT_SIZE; x *= x, index += 1, exponent += exponent) { the_table[index] = x; int_table[index] = exponent; } for (x = 0.5, index = -1, exponent = -1; index > -FLONUM_EXPT_SIZE; x *= x, index -= 1, exponent += exponent) { the_table[index] = x; int_table[index] = exponent; } floating_table_initialized = true; } double frexp(value, eptr) double value; int *eptr; { register double mant; register int exponent, index; register double *the_table = &floating_table[FLONUM_EXPT_SIZE-1]; register int *int_table = &exponent_table[FLONUM_EXPT_SIZE-1]; if (value == 0.0) { *eptr = 0; return 0.0; } if (!floating_table_initialized) initialize_floating_table(); mant = ((value < 0.0) ? -value : value); exponent = 0; while (mant < 0.5) { for (index = -FLONUM_EXPT_SIZE+1; the_table[index] < mant; index += 1) ; exponent += int_table[index]; mant /= the_table[index]; } if (mant >= 1.0) { while (mant >= 2.0) { for (index = FLONUM_EXPT_SIZE-1; the_table[index] > mant; index -= 1) ; exponent += int_table[index]; mant /= the_table[index]; } mant /= 2.0; exponent += 1; } *eptr = exponent; return ((value < 0.0) ? -mant : mant); } double ldexp(value, exponent) register double value; register int exponent; { register int index; register double *the_table = &floating_table[FLONUM_EXPT_SIZE-1]; register int *int_table = &exponent_table[FLONUM_EXPT_SIZE-1]; if (value == 0.0) return 0.0; if (!floating_table_initialized) initialize_floating_table(); while (exponent > 0) { for(index = FLONUM_EXPT_SIZE-1; int_table[index] > exponent; index -= 1) ; exponent -= int_table[index]; value *= the_table[index]; } while (exponent < 0) { for(index = -FLONUM_EXPT_SIZE+1; int_table[index] < exponent; index += 1) ; exponent -= int_table[index]; value *= the_table[index]; } return value; } \f #if DEBUG #include <stdio.h> main() { double input, output; int exponent; while (true) { printf("Number -> "); scanf("%F", &input); output = frexp(input, &exponent); printf("Input = %G; Output = %G; Exponent = %d\n", input, output, exponent); printf("Result = %G\n", ldexp(output, exponent)); } } #endif