#include #include #include #include "gdtoa.h" FPI fpi_near = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0 }; FPI fpi_zero = { 53, 1-1023-53+1, 2046-1023-53+1, 0, 0 }; FPI fpi_up = { 53, 1-1023-53+1, 2046-1023-53+1, 2, 0 }; FPI fpi_down = { 53, 1-1023-53+1, 2046-1023-53+1, 3, 0 }; typedef __int64 s64; char * mygdtoa( double d, int mode, int ndigits, FPI * amper_fpi) { s64 l = * (s64*)&d; int i0 = (int) (l >> 32); int i1 = (int) l; int m0 = i0 & 0xfffff; int e0 = (i0 >> 20) & 0x7ff; int isNeg = i0 < 0; int mantissa[2]; int decpt; int kind = STRTOG_Normal; char * result; char * rve; int length; if (e0 == 0x7ff) { if ((m0 | i1) != 0) { return "NaN"; } else { return isNeg ? "-Infinity" : "Infinity"; } } if ((m0 | i1 | e0) == 0) { return isNeg ? "-0.0" : "0.0"; } if (e0 != 0) m0 |= 0x100000; else e0 = 1; e0 -= 0x3ff + 52; mantissa[0] = i1; mantissa[1] = m0; result = gdtoa(amper_fpi, e0, mantissa, &kind, mode, ndigits, &decpt, &rve); length = rve - result; return result; } test1(double x, int n) { printf("near %d %s\n", n, mygdtoa(x,2,n, &fpi_near)); printf("zero %d %s\n", n, mygdtoa(x,2,n, &fpi_zero)); printf("up %d %s\n", n, mygdtoa(x,2,n, &fpi_up)); printf("down %d %s\n", n, mygdtoa(x,2,n, &fpi_down)); } void test (double x) { test1(x,1); test1(x,5); test1(x,6); test1(x,7); test1(x,8); test1(-x,5); test1(-x,6); test1(-x,7); test1(-x,8); printf("\n"); } int main(int argc, char ** argv) { test (0.40999995); test (0.40444449); test (1.5); test (2.5); }