/*****************************************************************************/ /* */ /* fp.h */ /* */ /* Floating point support */ /* */ /* */ /* */ /* (C) 2008 Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ /* warranty. In no event will the authors be held liable for any damages */ /* arising from the use of this software. */ /* */ /* Permission is granted to anyone to use this software for any purpose, */ /* including commercial applications, and to alter it and redistribute it */ /* freely, subject to the following restrictions: */ /* */ /* 1. The origin of this software must not be misrepresented; you must not */ /* claim that you wrote the original software. If you use this software */ /* in a product, an acknowledgment in the product documentation would be */ /* appreciated but is not required. */ /* 2. Altered source versions must be plainly marked as such, and must not */ /* be misrepresented as being the original software. */ /* 3. This notice may not be removed or altered from any source */ /* distribution. */ /* */ /*****************************************************************************/ /* The compiler must use the same floating point arithmetic as the target ** platform, otherwise expressions will yield a different result when ** evaluated in the compiler or on the target platform. Since writing a target ** and source library is almost double the work, we will at least add the ** hooks here, and define functions for a plug in library that may be added ** at a later time. Currently we use the builtin data types of the compiler ** that translates cc65. ** ** BEWARE: This code will currently only work on little endian systems! */ #ifndef FP_H #define FP_H #include /*****************************************************************************/ /* Data */ /*****************************************************************************/ typedef union Float Float; union Float { float V; }; typedef union Double Double; union Double { double V; }; /*****************************************************************************/ /* Code */ /*****************************************************************************/ size_t FP_F_Size (void); /* Return the size of the data type float */ unsigned char* FP_F_Data (Float Val); /* Return the raw data of a float in a malloc'ed buffer. Free after use. */ Float FP_F_Make (float Val); /* Make a floating point variable from a float value */ Float FP_F_FromInt (long Val); /* Convert an integer into a floating point variable */ float FP_F_ToFloat (Float Val); /* Convert a Float into a native float */ Float FP_F_Add (Float Left, Float Right); /* Add two floats */ Float FP_F_Sub (Float Left, Float Right); /* Subtract two floats */ Float FP_F_Mul (Float Left, Float Right); /* Multiply two floats */ Float FP_F_Div (Float Left, Float Right); /* Divide two floats */ size_t FP_D_Size (void); /* Return the size of the data type double */ unsigned char* FP_D_Data (Double Val); /* Return the raw data of a double in a malloc'ed buffer. Free after use. */ Double FP_D_Make (double Val); /* Make a floating point variable from a float value */ Double FP_D_FromInt (long Val); /* Convert an integer into a floating point variable */ double FP_D_ToFloat (Double Val); /* Convert a Double into a native double */ Double FP_D_Add (Double Left, Double Right); /* Add two floats */ Double FP_D_Sub (Double Left, Double Right); /* Subtract two floats */ Double FP_D_Mul (Double Left, Double Right); /* Multiply two floats */ Double FP_D_Div (Double Left, Double Right); /* Divide two floats */ /* End of fp.h */ #endif