/rust/registry/src/index.crates.io-1949cf8c6b5b557f/dtoa-0.4.7/src/lib.rs
Line | Count | Source |
1 | | //! [![github]](https://github.com/dtolnay/dtoa) [![crates-io]](https://crates.io/crates/dtoa) [![docs-rs]](https://docs.rs/dtoa) |
2 | | //! |
3 | | //! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github |
4 | | //! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust |
5 | | //! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K |
6 | | //! |
7 | | //! <br> |
8 | | //! |
9 | | //! This crate provides fast functions for printing floating-point primitives to |
10 | | //! an [`io::Write`]. The implementation is a straightforward Rust port of [Milo |
11 | | //! Yip]'s C++ implementation [dtoa.h]. The original C++ code of each function |
12 | | //! is included in comments. |
13 | | //! |
14 | | //! See also [`itoa`] for printing integer primitives. |
15 | | //! |
16 | | //! [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html |
17 | | //! [Milo Yip]: https://github.com/miloyip |
18 | | //! [dtoa.h]: https://github.com/miloyip/rapidjson/blob/master/include/rapidjson/internal/dtoa.h |
19 | | //! [`itoa`]: https://github.com/dtolnay/itoa |
20 | | //! |
21 | | //! <br> |
22 | | //! |
23 | | //! ## Performance (lower is better) |
24 | | //! |
25 | | //!  |
26 | | //! |
27 | | //! <br> |
28 | | //! |
29 | | //! # Examples |
30 | | //! |
31 | | //! ```edition2018 |
32 | | //! use std::io; |
33 | | //! |
34 | | //! fn main() -> io::Result<()> { |
35 | | //! // Write to a vector or other io::Write. |
36 | | //! let mut buf = Vec::new(); |
37 | | //! dtoa::write(&mut buf, 2.71828f64)?; |
38 | | //! println!("{:?}", buf); |
39 | | //! |
40 | | //! // Write to a stack buffer. |
41 | | //! let mut bytes = [b'\0'; 20]; |
42 | | //! let n = dtoa::write(&mut bytes[..], 2.71828f64)?; |
43 | | //! println!("{:?}", &bytes[..n]); |
44 | | //! |
45 | | //! Ok(()) |
46 | | //! } |
47 | | //! ``` |
48 | | |
49 | | #![doc(html_root_url = "https://docs.rs/dtoa/0.4.7")] |
50 | | |
51 | | #[macro_use] mod diyfp; |
52 | | #[macro_use] mod dtoa; |
53 | | |
54 | | use std::{io, mem, ops, ptr, slice}; |
55 | | |
56 | | /// Write float to an `io::Write`. |
57 | | #[inline] |
58 | 73.9M | pub fn write<W: io::Write, V: Floating>(wr: W, value: V) -> io::Result<usize> { |
59 | 73.9M | value.write(wr) |
60 | 73.9M | } dtoa::write::<&mut [u8], f32> Line | Count | Source | 58 | 73.9M | pub fn write<W: io::Write, V: Floating>(wr: W, value: V) -> io::Result<usize> { | 59 | 73.9M | value.write(wr) | 60 | 73.9M | } |
Unexecuted instantiation: dtoa::write::<_, _> |
61 | | |
62 | | /// An floating point number that can be formatted by `dtoa::write`. |
63 | | pub trait Floating { |
64 | | fn write<W: io::Write>(self, W) -> io::Result<usize>; |
65 | | } |
66 | | |
67 | | impl Floating for f32 { |
68 | 73.9M | fn write<W: io::Write>(self, wr: W) -> io::Result<usize> { |
69 | | dtoa! { |
70 | | floating_type: f32, |
71 | | significand_type: u32, |
72 | | exponent_type: i32, |
73 | | |
74 | | diy_significand_size: 32, |
75 | | significand_size: 23, |
76 | | exponent_bias: 0x7F, |
77 | | mask_type: u32, |
78 | | exponent_mask: 0x7F800000, |
79 | | significand_mask: 0x007FFFFF, |
80 | | hidden_bit: 0x00800000, |
81 | | cached_powers_f: CACHED_POWERS_F_32, |
82 | | cached_powers_e: CACHED_POWERS_E_32, |
83 | | min_power: (-36), |
84 | | }; |
85 | 73.9M | unsafe { dtoa(wr, self) } |
86 | 73.9M | } <f32 as dtoa::Floating>::write::<&mut [u8]> Line | Count | Source | 68 | 73.9M | fn write<W: io::Write>(self, wr: W) -> io::Result<usize> { | 69 | | dtoa! { | 70 | | floating_type: f32, | 71 | | significand_type: u32, | 72 | | exponent_type: i32, | 73 | | | 74 | | diy_significand_size: 32, | 75 | | significand_size: 23, | 76 | | exponent_bias: 0x7F, | 77 | | mask_type: u32, | 78 | | exponent_mask: 0x7F800000, | 79 | | significand_mask: 0x007FFFFF, | 80 | | hidden_bit: 0x00800000, | 81 | | cached_powers_f: CACHED_POWERS_F_32, | 82 | | cached_powers_e: CACHED_POWERS_E_32, | 83 | | min_power: (-36), | 84 | | }; | 85 | 73.9M | unsafe { dtoa(wr, self) } | 86 | 73.9M | } |
Unexecuted instantiation: <f32 as dtoa::Floating>::write::<_> |
87 | | } |
88 | | |
89 | | impl Floating for f64 { |
90 | 0 | fn write<W: io::Write>(self, wr: W) -> io::Result<usize> { |
91 | | dtoa! { |
92 | | floating_type: f64, |
93 | | significand_type: u64, |
94 | | exponent_type: isize, |
95 | | |
96 | | diy_significand_size: 64, |
97 | | significand_size: 52, |
98 | | exponent_bias: 0x3FF, |
99 | | mask_type: u64, |
100 | | exponent_mask: 0x7FF0000000000000, |
101 | | significand_mask: 0x000FFFFFFFFFFFFF, |
102 | | hidden_bit: 0x0010000000000000, |
103 | | cached_powers_f: CACHED_POWERS_F_64, |
104 | | cached_powers_e: CACHED_POWERS_E_64, |
105 | | min_power: (-348), |
106 | | }; |
107 | 0 | unsafe { dtoa(wr, self) } |
108 | 0 | } |
109 | | } |
110 | | |
111 | | //////////////////////////////////////////////////////////////////////////////// |
112 | | |
113 | | const MAX_DECIMAL_PLACES: isize = 324; |
114 | | |
115 | | static DEC_DIGITS_LUT: [u8; 200] = *b"\ |
116 | | 0001020304050607080910111213141516171819\ |
117 | | 2021222324252627282930313233343536373839\ |
118 | | 4041424344454647484950515253545556575859\ |
119 | | 6061626364656667686970717273747576777879\ |
120 | | 8081828384858687888990919293949596979899"; |
121 | | |
122 | | // 10^-36, 10^-28, ..., 10^52 |
123 | | static CACHED_POWERS_F_32: [u32; 12] = [ |
124 | | 0xaa242499, 0xfd87b5f3, 0xbce50865, 0x8cbccc09, |
125 | | 0xd1b71759, 0x9c400000, 0xe8d4a510, 0xad78ebc6, |
126 | | 0x813f3979, 0xc097ce7c, 0x8f7e32ce, 0xd5d238a5, |
127 | | ]; |
128 | | |
129 | | static CACHED_POWERS_E_32: [i16; 12] = [ |
130 | | -151, -125, -98, -71, -45, -18, 8, 35, 62, 88, 115, 141, |
131 | | ]; |
132 | | |
133 | | // 10^-348, 10^-340, ..., 10^340 |
134 | | static CACHED_POWERS_F_64: [u64; 87] = [ |
135 | | 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, |
136 | | 0x8b16fb203055ac76, 0xcf42894a5dce35ea, |
137 | | 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, |
138 | | 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, |
139 | | 0xbe5691ef416bd60c, 0x8dd01fad907ffc3c, |
140 | | 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, |
141 | | 0xea9c227723ee8bcb, 0xaecc49914078536d, |
142 | | 0x823c12795db6ce57, 0xc21094364dfb5637, |
143 | | 0x9096ea6f3848984f, 0xd77485cb25823ac7, |
144 | | 0xa086cfcd97bf97f4, 0xef340a98172aace5, |
145 | | 0xb23867fb2a35b28e, 0x84c8d4dfd2c63f3b, |
146 | | 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, |
147 | | 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, |
148 | | 0xf3e2f893dec3f126, 0xb5b5ada8aaff80b8, |
149 | | 0x87625f056c7c4a8b, 0xc9bcff6034c13053, |
150 | | 0x964e858c91ba2655, 0xdff9772470297ebd, |
151 | | 0xa6dfbd9fb8e5b88f, 0xf8a95fcf88747d94, |
152 | | 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, |
153 | | 0xcdb02555653131b6, 0x993fe2c6d07b7fac, |
154 | | 0xe45c10c42a2b3b06, 0xaa242499697392d3, |
155 | | 0xfd87b5f28300ca0e, 0xbce5086492111aeb, |
156 | | 0x8cbccc096f5088cc, 0xd1b71758e219652c, |
157 | | 0x9c40000000000000, 0xe8d4a51000000000, |
158 | | 0xad78ebc5ac620000, 0x813f3978f8940984, |
159 | | 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, |
160 | | 0xd5d238a4abe98068, 0x9f4f2726179a2245, |
161 | | 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, |
162 | | 0x83c7088e1aab65db, 0xc45d1df942711d9a, |
163 | | 0x924d692ca61be758, 0xda01ee641a708dea, |
164 | | 0xa26da3999aef774a, 0xf209787bb47d6b85, |
165 | | 0xb454e4a179dd1877, 0x865b86925b9bc5c2, |
166 | | 0xc83553c5c8965d3d, 0x952ab45cfa97a0b3, |
167 | | 0xde469fbd99a05fe3, 0xa59bc234db398c25, |
168 | | 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, |
169 | | 0x88fcf317f22241e2, 0xcc20ce9bd35c78a5, |
170 | | 0x98165af37b2153df, 0xe2a0b5dc971f303a, |
171 | | 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, |
172 | | 0xbb764c4ca7a44410, 0x8bab8eefb6409c1a, |
173 | | 0xd01fef10a657842c, 0x9b10a4e5e9913129, |
174 | | 0xe7109bfba19c0c9d, 0xac2820d9623bf429, |
175 | | 0x80444b5e7aa7cf85, 0xbf21e44003acdd2d, |
176 | | 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, |
177 | | 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, |
178 | | 0xaf87023b9bf0ee6b, |
179 | | ]; |
180 | | static CACHED_POWERS_E_64: [i16; 87] = [ |
181 | | -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, |
182 | | -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, |
183 | | -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, |
184 | | -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, |
185 | | -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, |
186 | | 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, |
187 | | 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, |
188 | | 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, |
189 | | 907, 933, 960, 986, 1013, 1039, 1066, |
190 | | ]; |