Coverage Report

Created: 2026-11-12 06:36

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
//! ![performance](https://raw.githubusercontent.com/dtolnay/dtoa/master/performance.png)
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
];