A port of the irrlicht XML parser library.
fast_atof.h@0:41a49a73580c, 2010-11-17 (annotated)
- Committer:
- hlipka
- Date:
- Wed Nov 17 20:19:41 2010 +0000
- Revision:
- 0:41a49a73580c
initial version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hlipka | 0:41a49a73580c | 1 | // Copyright (C) 2002-2005 Nikolaus Gebhardt |
hlipka | 0:41a49a73580c | 2 | // This file is part of the "Irrlicht Engine" and the "irrXML" project. |
hlipka | 0:41a49a73580c | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h |
hlipka | 0:41a49a73580c | 4 | |
hlipka | 0:41a49a73580c | 5 | #ifndef __FAST_A_TO_F_H_INCLUDED__ |
hlipka | 0:41a49a73580c | 6 | #define __FAST_A_TO_F_H_INCLUDED__ |
hlipka | 0:41a49a73580c | 7 | |
hlipka | 0:41a49a73580c | 8 | #include <stdlib.h> |
hlipka | 0:41a49a73580c | 9 | #include <math.h> |
hlipka | 0:41a49a73580c | 10 | |
hlipka | 0:41a49a73580c | 11 | namespace irr |
hlipka | 0:41a49a73580c | 12 | { |
hlipka | 0:41a49a73580c | 13 | namespace core |
hlipka | 0:41a49a73580c | 14 | { |
hlipka | 0:41a49a73580c | 15 | |
hlipka | 0:41a49a73580c | 16 | const float fast_atof_table[] = { |
hlipka | 0:41a49a73580c | 17 | 0.f, |
hlipka | 0:41a49a73580c | 18 | 0.1f, |
hlipka | 0:41a49a73580c | 19 | 0.01f, |
hlipka | 0:41a49a73580c | 20 | 0.001f, |
hlipka | 0:41a49a73580c | 21 | 0.0001f, |
hlipka | 0:41a49a73580c | 22 | 0.00001f, |
hlipka | 0:41a49a73580c | 23 | 0.000001f, |
hlipka | 0:41a49a73580c | 24 | 0.0000001f, |
hlipka | 0:41a49a73580c | 25 | 0.00000001f, |
hlipka | 0:41a49a73580c | 26 | 0.000000001f, |
hlipka | 0:41a49a73580c | 27 | 0.0000000001f, |
hlipka | 0:41a49a73580c | 28 | 0.00000000001f, |
hlipka | 0:41a49a73580c | 29 | 0.000000000001f, |
hlipka | 0:41a49a73580c | 30 | 0.0000000000001f, |
hlipka | 0:41a49a73580c | 31 | 0.00000000000001f, |
hlipka | 0:41a49a73580c | 32 | 0.000000000000001f |
hlipka | 0:41a49a73580c | 33 | }; |
hlipka | 0:41a49a73580c | 34 | |
hlipka | 0:41a49a73580c | 35 | //! Provides a fast function for converting a string into a float, |
hlipka | 0:41a49a73580c | 36 | //! about 6 times faster than atof in win32. |
hlipka | 0:41a49a73580c | 37 | // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. |
hlipka | 0:41a49a73580c | 38 | inline char* fast_atof_move(char* c, float& out) |
hlipka | 0:41a49a73580c | 39 | { |
hlipka | 0:41a49a73580c | 40 | bool inv = false; |
hlipka | 0:41a49a73580c | 41 | char *t; |
hlipka | 0:41a49a73580c | 42 | float f; |
hlipka | 0:41a49a73580c | 43 | |
hlipka | 0:41a49a73580c | 44 | if (*c=='-') |
hlipka | 0:41a49a73580c | 45 | { |
hlipka | 0:41a49a73580c | 46 | c++; |
hlipka | 0:41a49a73580c | 47 | inv = true; |
hlipka | 0:41a49a73580c | 48 | } |
hlipka | 0:41a49a73580c | 49 | |
hlipka | 0:41a49a73580c | 50 | f = (float)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 51 | |
hlipka | 0:41a49a73580c | 52 | c = t; |
hlipka | 0:41a49a73580c | 53 | |
hlipka | 0:41a49a73580c | 54 | if (*c == '.') |
hlipka | 0:41a49a73580c | 55 | { |
hlipka | 0:41a49a73580c | 56 | c++; |
hlipka | 0:41a49a73580c | 57 | |
hlipka | 0:41a49a73580c | 58 | float pl = (float)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 59 | pl *= fast_atof_table[t-c]; |
hlipka | 0:41a49a73580c | 60 | |
hlipka | 0:41a49a73580c | 61 | f += pl; |
hlipka | 0:41a49a73580c | 62 | |
hlipka | 0:41a49a73580c | 63 | c = t; |
hlipka | 0:41a49a73580c | 64 | |
hlipka | 0:41a49a73580c | 65 | if (*c == 'e') |
hlipka | 0:41a49a73580c | 66 | { |
hlipka | 0:41a49a73580c | 67 | ++c; |
hlipka | 0:41a49a73580c | 68 | float exp = (float)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 69 | f *= (float)pow(10.0f, exp); |
hlipka | 0:41a49a73580c | 70 | c = t; |
hlipka | 0:41a49a73580c | 71 | } |
hlipka | 0:41a49a73580c | 72 | } |
hlipka | 0:41a49a73580c | 73 | |
hlipka | 0:41a49a73580c | 74 | if (inv) |
hlipka | 0:41a49a73580c | 75 | f *= -1.0f; |
hlipka | 0:41a49a73580c | 76 | |
hlipka | 0:41a49a73580c | 77 | out = f; |
hlipka | 0:41a49a73580c | 78 | return c; |
hlipka | 0:41a49a73580c | 79 | } |
hlipka | 0:41a49a73580c | 80 | |
hlipka | 0:41a49a73580c | 81 | //! Provides a fast function for converting a string into a float, |
hlipka | 0:41a49a73580c | 82 | //! about 6 times faster than atof in win32. |
hlipka | 0:41a49a73580c | 83 | // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. |
hlipka | 0:41a49a73580c | 84 | inline const char* fast_atof_move_const(const char* c, float& out) |
hlipka | 0:41a49a73580c | 85 | { |
hlipka | 0:41a49a73580c | 86 | bool inv = false; |
hlipka | 0:41a49a73580c | 87 | char *t; |
hlipka | 0:41a49a73580c | 88 | float f; |
hlipka | 0:41a49a73580c | 89 | |
hlipka | 0:41a49a73580c | 90 | if (*c=='-') |
hlipka | 0:41a49a73580c | 91 | { |
hlipka | 0:41a49a73580c | 92 | c++; |
hlipka | 0:41a49a73580c | 93 | inv = true; |
hlipka | 0:41a49a73580c | 94 | } |
hlipka | 0:41a49a73580c | 95 | |
hlipka | 0:41a49a73580c | 96 | f = (float)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 97 | |
hlipka | 0:41a49a73580c | 98 | c = t; |
hlipka | 0:41a49a73580c | 99 | |
hlipka | 0:41a49a73580c | 100 | if (*c == '.') |
hlipka | 0:41a49a73580c | 101 | { |
hlipka | 0:41a49a73580c | 102 | c++; |
hlipka | 0:41a49a73580c | 103 | |
hlipka | 0:41a49a73580c | 104 | float pl = (float)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 105 | pl *= fast_atof_table[t-c]; |
hlipka | 0:41a49a73580c | 106 | |
hlipka | 0:41a49a73580c | 107 | f += pl; |
hlipka | 0:41a49a73580c | 108 | |
hlipka | 0:41a49a73580c | 109 | c = t; |
hlipka | 0:41a49a73580c | 110 | |
hlipka | 0:41a49a73580c | 111 | if (*c == 'e') |
hlipka | 0:41a49a73580c | 112 | { |
hlipka | 0:41a49a73580c | 113 | ++c; |
hlipka | 0:41a49a73580c | 114 | f32 exp = (f32)strtol(c, &t, 10); |
hlipka | 0:41a49a73580c | 115 | f *= (f32)powf(10.0f, exp); |
hlipka | 0:41a49a73580c | 116 | c = t; |
hlipka | 0:41a49a73580c | 117 | } |
hlipka | 0:41a49a73580c | 118 | } |
hlipka | 0:41a49a73580c | 119 | |
hlipka | 0:41a49a73580c | 120 | if (inv) |
hlipka | 0:41a49a73580c | 121 | f *= -1.0f; |
hlipka | 0:41a49a73580c | 122 | |
hlipka | 0:41a49a73580c | 123 | out = f; |
hlipka | 0:41a49a73580c | 124 | return c; |
hlipka | 0:41a49a73580c | 125 | } |
hlipka | 0:41a49a73580c | 126 | |
hlipka | 0:41a49a73580c | 127 | |
hlipka | 0:41a49a73580c | 128 | inline float fast_atof(const char* c) |
hlipka | 0:41a49a73580c | 129 | { |
hlipka | 0:41a49a73580c | 130 | float ret; |
hlipka | 0:41a49a73580c | 131 | fast_atof_move_const(c, ret); |
hlipka | 0:41a49a73580c | 132 | return ret; |
hlipka | 0:41a49a73580c | 133 | } |
hlipka | 0:41a49a73580c | 134 | |
hlipka | 0:41a49a73580c | 135 | } // end namespace core |
hlipka | 0:41a49a73580c | 136 | }// end namespace irr |
hlipka | 0:41a49a73580c | 137 | |
hlipka | 0:41a49a73580c | 138 | #endif |