//----------------------------------------------------------------------------- // Copyright © 2003 - Philip Howard - All rights reserved // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //----------------------------------------------------------------------------- // package libh/arith // homepage http://libh.slashusr.org/ //----------------------------------------------------------------------------- // author Philip Howard // email libh at ipal dot org // homepage http://phil.ipal.org/ //----------------------------------------------------------------------------- // This file is best viewed using a fixed spaced font such as Courier // and in a display at least 120 columns wide. //----------------------------------------------------------------------------- #include #include "arith_lib.h" __FMACRO_BEGIN__ //----------------------------------------------------------------------------- // macro rescale_ldm // // purpose Given a new linear number range and an old linear number range, // rescale multiple numbers from the old range to the new range, // storing back the results in the pointed to arguments given. // // arguments 1 (long double) 1st value of new number range // 2 (long double) 2nd value of new number range // 3 (long double) 1st value of old number range // 4 (long double) 2nd value of old number range // 5..N (long double *) pointer to one or more values // // returns (int) 0 //----------------------------------------------------------------------------- #define rescale_ldm(na,nz,oa,oz,a...) ((rescale_ldm)((na),(nz),(oa),(oz),a,((double*)(NULL)))) __FMACRO_END__ __PROTO_BEGIN__ //----------------------------------------------------------------------------- // function (rescale_ldm) // // purpose Given a new linear number range and an old linear number range, // rescale multiple numbers from the old range to the new range, // storing back the results in the pointed to arguments given. // // arguments 1 (long double) 1st value of new number range // 2 (long double) 2nd value of new number range // 3 (long double) 1st value of old number range // 4 (long double) 2nd value of old number range // 5..N (long double *) pointer to one or more values // N+1 (long double *) NULL to indicate end of list // // returns (int) 0 //----------------------------------------------------------------------------- int (rescale_ldm) ( long double arg_new_a , long double arg_new_z , long double arg_old_a , long double arg_old_z , long double * arg_value_p , ... ) __PROTO_END__ { va_list var_args ; long double * value_p ; long double new_diff ; long double old_diff ; long double factor ; new_diff = arg_new_z - arg_new_a; old_diff = arg_old_z - arg_old_a; factor = arg_new_a * old_diff; value_p = arg_value_p; va_start( var_args, arg_value_p ); do { * value_p = ( ( new_diff * ( * value_p - arg_old_a ) ) + factor ) / old_diff; } while ( ( value_p = va_arg( var_args, long double * ) ) ); return 0; }