X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=fltpoint.c;h=8739e88c1500d73397e6974df8c506377ee2e91a;hp=fa1eb41ad9c78af887a63b444f099a4ecf184d95;hb=29fa5dcf504b966803063a1c2891f58f97126d04;hpb=9153334781cd2e23750f4dc002e847606c07a1f0 diff --git a/fltpoint.c b/fltpoint.c index fa1eb41..8739e88 100644 --- a/fltpoint.c +++ b/fltpoint.c @@ -2,7 +2,7 @@ // Floating point to IEEE-754 conversion routines // // by James Hammons -// (C) 2018 Underground Software +// (C) 2019 Underground Software // // Since there are no guarantees vis-a-vis floating point numbers in C, we have // to utilize routines like the following in order to guarantee that the thing @@ -14,6 +14,7 @@ #include "fltpoint.h" #include #include +#include // // Check for IEEE-754 conformance (C99 compilers should be OK here) @@ -169,3 +170,25 @@ void DoubleToExtended(double d, uint8_t out[]) out[11] = intMant & 0xFF; } + +// +// Convert a host native floating point number to a fixed point number. +// +uint64_t DoubleToFixedPoint(double d, int intBits, int fracBits) +{ + uint8_t signBit = (signbit(d) ? 1 : 0); + + // Ensure what we're working on is positive... + if (d < 0) + d *= -1; + + double scaleFactor = (double)(1 << fracBits); + uint64_t result = (uint64_t)(d * scaleFactor); + + // Invert the result, if necessary + if (signBit == 1) + result = (result = 0xFFFFFFFFFFFFFFFFLL) + 1; + + return result; +} +