hitokage 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +89 -0
  7. data/Rakefile +19 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/ext/hitokage_ext/double-conversion/AUTHORS +14 -0
  11. data/ext/hitokage_ext/double-conversion/COPYING +26 -0
  12. data/ext/hitokage_ext/double-conversion/LICENSE +26 -0
  13. data/ext/hitokage_ext/double-conversion/README +54 -0
  14. data/ext/hitokage_ext/double-conversion/bignum-dtoa.cc +641 -0
  15. data/ext/hitokage_ext/double-conversion/bignum-dtoa.h +84 -0
  16. data/ext/hitokage_ext/double-conversion/bignum.cc +766 -0
  17. data/ext/hitokage_ext/double-conversion/bignum.h +144 -0
  18. data/ext/hitokage_ext/double-conversion/cached-powers.cc +175 -0
  19. data/ext/hitokage_ext/double-conversion/cached-powers.h +64 -0
  20. data/ext/hitokage_ext/double-conversion/diy-fp.cc +57 -0
  21. data/ext/hitokage_ext/double-conversion/diy-fp.h +118 -0
  22. data/ext/hitokage_ext/double-conversion/double-conversion.cc +982 -0
  23. data/ext/hitokage_ext/double-conversion/double-conversion.h +543 -0
  24. data/ext/hitokage_ext/double-conversion/fast-dtoa.cc +665 -0
  25. data/ext/hitokage_ext/double-conversion/fast-dtoa.h +88 -0
  26. data/ext/hitokage_ext/double-conversion/fixed-dtoa.cc +404 -0
  27. data/ext/hitokage_ext/double-conversion/fixed-dtoa.h +56 -0
  28. data/ext/hitokage_ext/double-conversion/ieee.h +402 -0
  29. data/ext/hitokage_ext/double-conversion/strtod.cc +555 -0
  30. data/ext/hitokage_ext/double-conversion/strtod.h +45 -0
  31. data/ext/hitokage_ext/double-conversion/utils.h +341 -0
  32. data/ext/hitokage_ext/extconf.rb +10 -0
  33. data/ext/hitokage_ext/hitokage_ext.cc +26 -0
  34. data/hitokage.gemspec +26 -0
  35. data/lib/hitokage.rb +5 -0
  36. data/lib/hitokage/replace_float_to_s.rb +6 -0
  37. data/lib/hitokage/version.rb +3 -0
  38. metadata +136 -0
@@ -0,0 +1,56 @@
1
+ // Copyright 2010 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef DOUBLE_CONVERSION_FIXED_DTOA_H_
29
+ #define DOUBLE_CONVERSION_FIXED_DTOA_H_
30
+
31
+ #include "utils.h"
32
+
33
+ namespace double_conversion {
34
+
35
+ // Produces digits necessary to print a given number with
36
+ // 'fractional_count' digits after the decimal point.
37
+ // The buffer must be big enough to hold the result plus one terminating null
38
+ // character.
39
+ //
40
+ // The produced digits might be too short in which case the caller has to fill
41
+ // the gaps with '0's.
42
+ // Example: FastFixedDtoa(0.001, 5, ...) is allowed to return buffer = "1", and
43
+ // decimal_point = -2.
44
+ // Halfway cases are rounded towards +/-Infinity (away from 0). The call
45
+ // FastFixedDtoa(0.15, 2, ...) thus returns buffer = "2", decimal_point = 0.
46
+ // The returned buffer may contain digits that would be truncated from the
47
+ // shortest representation of the input.
48
+ //
49
+ // This method only works for some parameters. If it can't handle the input it
50
+ // returns false. The output is null-terminated when the function succeeds.
51
+ bool FastFixedDtoa(double v, int fractional_count,
52
+ Vector<char> buffer, int* length, int* decimal_point);
53
+
54
+ } // namespace double_conversion
55
+
56
+ #endif // DOUBLE_CONVERSION_FIXED_DTOA_H_
@@ -0,0 +1,402 @@
1
+ // Copyright 2012 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef DOUBLE_CONVERSION_DOUBLE_H_
29
+ #define DOUBLE_CONVERSION_DOUBLE_H_
30
+
31
+ #include "diy-fp.h"
32
+
33
+ namespace double_conversion {
34
+
35
+ // We assume that doubles and uint64_t have the same endianness.
36
+ static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
37
+ static double uint64_to_double(uint64_t d64) { return BitCast<double>(d64); }
38
+ static uint32_t float_to_uint32(float f) { return BitCast<uint32_t>(f); }
39
+ static float uint32_to_float(uint32_t d32) { return BitCast<float>(d32); }
40
+
41
+ // Helper functions for doubles.
42
+ class Double {
43
+ public:
44
+ static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000);
45
+ static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000);
46
+ static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
47
+ static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000);
48
+ static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit.
49
+ static const int kSignificandSize = 53;
50
+
51
+ Double() : d64_(0) {}
52
+ explicit Double(double d) : d64_(double_to_uint64(d)) {}
53
+ explicit Double(uint64_t d64) : d64_(d64) {}
54
+ explicit Double(DiyFp diy_fp)
55
+ : d64_(DiyFpToUint64(diy_fp)) {}
56
+
57
+ // The value encoded by this Double must be greater or equal to +0.0.
58
+ // It must not be special (infinity, or NaN).
59
+ DiyFp AsDiyFp() const {
60
+ ASSERT(Sign() > 0);
61
+ ASSERT(!IsSpecial());
62
+ return DiyFp(Significand(), Exponent());
63
+ }
64
+
65
+ // The value encoded by this Double must be strictly greater than 0.
66
+ DiyFp AsNormalizedDiyFp() const {
67
+ ASSERT(value() > 0.0);
68
+ uint64_t f = Significand();
69
+ int e = Exponent();
70
+
71
+ // The current double could be a denormal.
72
+ while ((f & kHiddenBit) == 0) {
73
+ f <<= 1;
74
+ e--;
75
+ }
76
+ // Do the final shifts in one go.
77
+ f <<= DiyFp::kSignificandSize - kSignificandSize;
78
+ e -= DiyFp::kSignificandSize - kSignificandSize;
79
+ return DiyFp(f, e);
80
+ }
81
+
82
+ // Returns the double's bit as uint64.
83
+ uint64_t AsUint64() const {
84
+ return d64_;
85
+ }
86
+
87
+ // Returns the next greater double. Returns +infinity on input +infinity.
88
+ double NextDouble() const {
89
+ if (d64_ == kInfinity) return Double(kInfinity).value();
90
+ if (Sign() < 0 && Significand() == 0) {
91
+ // -0.0
92
+ return 0.0;
93
+ }
94
+ if (Sign() < 0) {
95
+ return Double(d64_ - 1).value();
96
+ } else {
97
+ return Double(d64_ + 1).value();
98
+ }
99
+ }
100
+
101
+ double PreviousDouble() const {
102
+ if (d64_ == (kInfinity | kSignMask)) return -Double::Infinity();
103
+ if (Sign() < 0) {
104
+ return Double(d64_ + 1).value();
105
+ } else {
106
+ if (Significand() == 0) return -0.0;
107
+ return Double(d64_ - 1).value();
108
+ }
109
+ }
110
+
111
+ int Exponent() const {
112
+ if (IsDenormal()) return kDenormalExponent;
113
+
114
+ uint64_t d64 = AsUint64();
115
+ int biased_e =
116
+ static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize);
117
+ return biased_e - kExponentBias;
118
+ }
119
+
120
+ uint64_t Significand() const {
121
+ uint64_t d64 = AsUint64();
122
+ uint64_t significand = d64 & kSignificandMask;
123
+ if (!IsDenormal()) {
124
+ return significand + kHiddenBit;
125
+ } else {
126
+ return significand;
127
+ }
128
+ }
129
+
130
+ // Returns true if the double is a denormal.
131
+ bool IsDenormal() const {
132
+ uint64_t d64 = AsUint64();
133
+ return (d64 & kExponentMask) == 0;
134
+ }
135
+
136
+ // We consider denormals not to be special.
137
+ // Hence only Infinity and NaN are special.
138
+ bool IsSpecial() const {
139
+ uint64_t d64 = AsUint64();
140
+ return (d64 & kExponentMask) == kExponentMask;
141
+ }
142
+
143
+ bool IsNan() const {
144
+ uint64_t d64 = AsUint64();
145
+ return ((d64 & kExponentMask) == kExponentMask) &&
146
+ ((d64 & kSignificandMask) != 0);
147
+ }
148
+
149
+ bool IsInfinite() const {
150
+ uint64_t d64 = AsUint64();
151
+ return ((d64 & kExponentMask) == kExponentMask) &&
152
+ ((d64 & kSignificandMask) == 0);
153
+ }
154
+
155
+ int Sign() const {
156
+ uint64_t d64 = AsUint64();
157
+ return (d64 & kSignMask) == 0? 1: -1;
158
+ }
159
+
160
+ // Precondition: the value encoded by this Double must be greater or equal
161
+ // than +0.0.
162
+ DiyFp UpperBoundary() const {
163
+ ASSERT(Sign() > 0);
164
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
165
+ }
166
+
167
+ // Computes the two boundaries of this.
168
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
169
+ // exponent as m_plus.
170
+ // Precondition: the value encoded by this Double must be greater than 0.
171
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
172
+ ASSERT(value() > 0.0);
173
+ DiyFp v = this->AsDiyFp();
174
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
175
+ DiyFp m_minus;
176
+ if (LowerBoundaryIsCloser()) {
177
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
178
+ } else {
179
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
180
+ }
181
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
182
+ m_minus.set_e(m_plus.e());
183
+ *out_m_plus = m_plus;
184
+ *out_m_minus = m_minus;
185
+ }
186
+
187
+ bool LowerBoundaryIsCloser() const {
188
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
189
+ // the lower boundary is closer.
190
+ // Think of v = 1000e10 and v- = 9999e9.
191
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
192
+ // at a distance of 1e8.
193
+ // The only exception is for the smallest normal: the largest denormal is
194
+ // at the same distance as its successor.
195
+ // Note: denormals have the same exponent as the smallest normals.
196
+ bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0);
197
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
198
+ }
199
+
200
+ double value() const { return uint64_to_double(d64_); }
201
+
202
+ // Returns the significand size for a given order of magnitude.
203
+ // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude.
204
+ // This function returns the number of significant binary digits v will have
205
+ // once it's encoded into a double. In almost all cases this is equal to
206
+ // kSignificandSize. The only exceptions are denormals. They start with
207
+ // leading zeroes and their effective significand-size is hence smaller.
208
+ static int SignificandSizeForOrderOfMagnitude(int order) {
209
+ if (order >= (kDenormalExponent + kSignificandSize)) {
210
+ return kSignificandSize;
211
+ }
212
+ if (order <= kDenormalExponent) return 0;
213
+ return order - kDenormalExponent;
214
+ }
215
+
216
+ static double Infinity() {
217
+ return Double(kInfinity).value();
218
+ }
219
+
220
+ static double NaN() {
221
+ return Double(kNaN).value();
222
+ }
223
+
224
+ private:
225
+ static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
226
+ static const int kDenormalExponent = -kExponentBias + 1;
227
+ static const int kMaxExponent = 0x7FF - kExponentBias;
228
+ static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000);
229
+ static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000);
230
+
231
+ const uint64_t d64_;
232
+
233
+ static uint64_t DiyFpToUint64(DiyFp diy_fp) {
234
+ uint64_t significand = diy_fp.f();
235
+ int exponent = diy_fp.e();
236
+ while (significand > kHiddenBit + kSignificandMask) {
237
+ significand >>= 1;
238
+ exponent++;
239
+ }
240
+ if (exponent >= kMaxExponent) {
241
+ return kInfinity;
242
+ }
243
+ if (exponent < kDenormalExponent) {
244
+ return 0;
245
+ }
246
+ while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) {
247
+ significand <<= 1;
248
+ exponent--;
249
+ }
250
+ uint64_t biased_exponent;
251
+ if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) {
252
+ biased_exponent = 0;
253
+ } else {
254
+ biased_exponent = static_cast<uint64_t>(exponent + kExponentBias);
255
+ }
256
+ return (significand & kSignificandMask) |
257
+ (biased_exponent << kPhysicalSignificandSize);
258
+ }
259
+
260
+ DISALLOW_COPY_AND_ASSIGN(Double);
261
+ };
262
+
263
+ class Single {
264
+ public:
265
+ static const uint32_t kSignMask = 0x80000000;
266
+ static const uint32_t kExponentMask = 0x7F800000;
267
+ static const uint32_t kSignificandMask = 0x007FFFFF;
268
+ static const uint32_t kHiddenBit = 0x00800000;
269
+ static const int kPhysicalSignificandSize = 23; // Excludes the hidden bit.
270
+ static const int kSignificandSize = 24;
271
+
272
+ Single() : d32_(0) {}
273
+ explicit Single(float f) : d32_(float_to_uint32(f)) {}
274
+ explicit Single(uint32_t d32) : d32_(d32) {}
275
+
276
+ // The value encoded by this Single must be greater or equal to +0.0.
277
+ // It must not be special (infinity, or NaN).
278
+ DiyFp AsDiyFp() const {
279
+ ASSERT(Sign() > 0);
280
+ ASSERT(!IsSpecial());
281
+ return DiyFp(Significand(), Exponent());
282
+ }
283
+
284
+ // Returns the single's bit as uint64.
285
+ uint32_t AsUint32() const {
286
+ return d32_;
287
+ }
288
+
289
+ int Exponent() const {
290
+ if (IsDenormal()) return kDenormalExponent;
291
+
292
+ uint32_t d32 = AsUint32();
293
+ int biased_e =
294
+ static_cast<int>((d32 & kExponentMask) >> kPhysicalSignificandSize);
295
+ return biased_e - kExponentBias;
296
+ }
297
+
298
+ uint32_t Significand() const {
299
+ uint32_t d32 = AsUint32();
300
+ uint32_t significand = d32 & kSignificandMask;
301
+ if (!IsDenormal()) {
302
+ return significand + kHiddenBit;
303
+ } else {
304
+ return significand;
305
+ }
306
+ }
307
+
308
+ // Returns true if the single is a denormal.
309
+ bool IsDenormal() const {
310
+ uint32_t d32 = AsUint32();
311
+ return (d32 & kExponentMask) == 0;
312
+ }
313
+
314
+ // We consider denormals not to be special.
315
+ // Hence only Infinity and NaN are special.
316
+ bool IsSpecial() const {
317
+ uint32_t d32 = AsUint32();
318
+ return (d32 & kExponentMask) == kExponentMask;
319
+ }
320
+
321
+ bool IsNan() const {
322
+ uint32_t d32 = AsUint32();
323
+ return ((d32 & kExponentMask) == kExponentMask) &&
324
+ ((d32 & kSignificandMask) != 0);
325
+ }
326
+
327
+ bool IsInfinite() const {
328
+ uint32_t d32 = AsUint32();
329
+ return ((d32 & kExponentMask) == kExponentMask) &&
330
+ ((d32 & kSignificandMask) == 0);
331
+ }
332
+
333
+ int Sign() const {
334
+ uint32_t d32 = AsUint32();
335
+ return (d32 & kSignMask) == 0? 1: -1;
336
+ }
337
+
338
+ // Computes the two boundaries of this.
339
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
340
+ // exponent as m_plus.
341
+ // Precondition: the value encoded by this Single must be greater than 0.
342
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
343
+ ASSERT(value() > 0.0);
344
+ DiyFp v = this->AsDiyFp();
345
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
346
+ DiyFp m_minus;
347
+ if (LowerBoundaryIsCloser()) {
348
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
349
+ } else {
350
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
351
+ }
352
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
353
+ m_minus.set_e(m_plus.e());
354
+ *out_m_plus = m_plus;
355
+ *out_m_minus = m_minus;
356
+ }
357
+
358
+ // Precondition: the value encoded by this Single must be greater or equal
359
+ // than +0.0.
360
+ DiyFp UpperBoundary() const {
361
+ ASSERT(Sign() > 0);
362
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
363
+ }
364
+
365
+ bool LowerBoundaryIsCloser() const {
366
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
367
+ // the lower boundary is closer.
368
+ // Think of v = 1000e10 and v- = 9999e9.
369
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
370
+ // at a distance of 1e8.
371
+ // The only exception is for the smallest normal: the largest denormal is
372
+ // at the same distance as its successor.
373
+ // Note: denormals have the same exponent as the smallest normals.
374
+ bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0);
375
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
376
+ }
377
+
378
+ float value() const { return uint32_to_float(d32_); }
379
+
380
+ static float Infinity() {
381
+ return Single(kInfinity).value();
382
+ }
383
+
384
+ static float NaN() {
385
+ return Single(kNaN).value();
386
+ }
387
+
388
+ private:
389
+ static const int kExponentBias = 0x7F + kPhysicalSignificandSize;
390
+ static const int kDenormalExponent = -kExponentBias + 1;
391
+ static const int kMaxExponent = 0xFF - kExponentBias;
392
+ static const uint32_t kInfinity = 0x7F800000;
393
+ static const uint32_t kNaN = 0x7FC00000;
394
+
395
+ const uint32_t d32_;
396
+
397
+ DISALLOW_COPY_AND_ASSIGN(Single);
398
+ };
399
+
400
+ } // namespace double_conversion
401
+
402
+ #endif // DOUBLE_CONVERSION_DOUBLE_H_