Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef FAST_OUTPUT_H
00038 #define FAST_OUTPUT_H
00039
00040 #include <cstdio>
00041 #include <stdint.h>
00042 #include <assert.h>
00043
00044 #ifdef __cplusplus
00045 extern "C" {
00046 #endif
00047
00048 inline void strreverse(char* begin, char* end)
00049 {
00050 char aux;
00051 while (end > begin)
00052 aux = *end, *end-- = *begin, *begin++ = aux;
00053 }
00054
00055 inline int modp_dtoa(double value, char* str, int prec)
00056 {
00057 static const double pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
00058
00059
00060
00061
00062
00063
00064 if (! (value == value)) {
00065 str[0] = 'n'; str[1] = 'a'; str[2] = 'n'; str[3] = '\0';
00066 assert(0);
00067 return 3;
00068 }
00069
00070 const double thres_max = (double)(0x7FFFFFFF);
00071
00072 double diff = 0.0;
00073 char* wstr = str;
00074
00075 if (prec < 0) {
00076 prec = 0;
00077 } else if (prec > 9) {
00078
00079 prec = 9;
00080 }
00081
00082
00083
00084
00085 int neg = 0;
00086 if (value < 0) {
00087 neg = 1;
00088 value = -value;
00089 }
00090
00091
00092 int whole = (int) value;
00093 double tmp = (value - whole) * pow10[prec];
00094 uint32_t frac = (uint32_t)(tmp);
00095 diff = tmp - frac;
00096
00097 if (diff > 0.5) {
00098 ++frac;
00099
00100 if (frac >= pow10[prec]) {
00101 frac = 0;
00102 ++whole;
00103 }
00104 } else if (diff == 0.5 && ((frac == 0) || (frac & 1))) {
00105
00106
00107 ++frac;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116 if (value > thres_max) {
00117 return sprintf(str, "%e", neg ? -value : value);
00118 }
00119
00120 if (prec == 0) {
00121 diff = value - whole;
00122 if (diff > 0.5) {
00123
00124 ++whole;
00125 } else if (diff == 0.5 && (whole & 1)) {
00126
00127
00128 ++whole;
00129 }
00130 } else {
00131 int count = prec;
00132
00133 do {
00134 --count;
00135 *wstr++ = (char)(48 + (frac % 10));
00136 } while (frac /= 10);
00137
00138 while (count-- > 0) *wstr++ = '0';
00139
00140 *wstr++ = '.';
00141 }
00142
00143
00144
00145
00146 do *wstr++ = (char)(48 + (whole % 10)); while (whole /= 10);
00147 if (neg) {
00148 *wstr++ = '-';
00149 }
00150
00151 strreverse(str, wstr-1);
00152 return wstr - str;
00153 }
00154
00155 inline int modp_uitoa10(uint32_t value, char* str)
00156 {
00157 char* wstr=str;
00158
00159 do *wstr++ = (char)(48 + (value % 10)); while (value /= 10);
00160
00161
00162 strreverse(str, wstr-1);
00163 return wstr - str;
00164 }
00165
00166 inline int modp_itoa10(int32_t value, char* str)
00167 {
00168 char* wstr=str;
00169
00170 unsigned int uvalue = (value < 0) ? -value : value;
00171
00172 do *wstr++ = (char)(48 + (uvalue % 10)); while(uvalue /= 10);
00173 if (value < 0) *wstr++ = '-';
00174 *wstr='\0';
00175
00176
00177 strreverse(str,wstr-1);
00178 return wstr - str;
00179 }
00180
00181 #ifdef __cplusplus
00182 }
00183 #endif
00184
00185 #endif