Skip to content

Commit 15222a9

Browse files
authored
builtin,strconv: fix zero to string conversion for floats, add tests (fix #26429) (#26435)
1 parent c3b924c commit 15222a9

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

‎vlib/builtin/float_test.v‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import math
2+
13
fn test_float_decl() {
24
// z := 1f
35
// assert z > 0
@@ -236,3 +238,59 @@ fn test_float_zero_str() {
236238
assert f2.str() == '0.0'
237239
assert '${f2}' == '0.0'
238240
}
241+
242+
fn test_f32_zero_chars() {
243+
bits := math.f32_bits('-0.0'.f32())
244+
assert math.f32_bits('-0 ms'.f32()) == bits
245+
assert math.f32_bits('-0.0 ms'.f32()) == bits
246+
assert math.f32_bits('-0.000 ms'.f32()) == bits
247+
assert math.f32_bits('0 ms'.f32()) == 0
248+
assert math.f32_bits('0.0 ms'.f32()) == 0
249+
assert math.f32_bits('0.000 ms'.f32()) == 0
250+
assert math.f32_bits('-0'.f32()) == bits
251+
assert math.f32_bits('-0.0'.f32()) == bits
252+
assert math.f32_bits('-0.000'.f32()) == bits
253+
assert math.f32_bits('0'.f32()) == 0
254+
assert math.f32_bits('0.0'.f32()) == 0
255+
assert math.f32_bits('0.000'.f32()) == 0
256+
assert '-0 ms'.f32().str() == '-0.0'
257+
assert '-0.0 ms'.f32().str() == '-0.0'
258+
assert '-0.000 ms'.f32().str() == '-0.0'
259+
assert '0 ms'.f32().str() == '0.0'
260+
assert '0.0 ms'.f32().str() == '0.0'
261+
assert '0.000 ms'.f32().str() == '0.0'
262+
assert '-0'.f32().str() == '-0.0'
263+
assert '-0.0'.f32().str() == '-0.0'
264+
assert '-0.000'.f32().str() == '-0.0'
265+
assert '0'.f32().str() == '0.0'
266+
assert '0.0'.f32().str() == '0.0'
267+
assert '0.00'.f32().str() == '0.0'
268+
}
269+
270+
fn test_f64_zero_chars() {
271+
bits := math.f64_bits('-0.0'.f64())
272+
assert math.f64_bits('-0 ms'.f64()) == bits
273+
assert math.f64_bits('-0.0 ms'.f64()) == bits
274+
assert math.f64_bits('-0.000 ms'.f64()) == bits
275+
assert math.f64_bits('0 ms'.f64()) == 0
276+
assert math.f64_bits('0.0 ms'.f64()) == 0
277+
assert math.f64_bits('0.000 ms'.f64()) == 0
278+
assert math.f64_bits('-0'.f64()) == bits
279+
assert math.f64_bits('-0.0'.f64()) == bits
280+
assert math.f64_bits('-0.000'.f64()) == bits
281+
assert math.f64_bits('0'.f64()) == 0
282+
assert math.f64_bits('0.0'.f64()) == 0
283+
assert math.f64_bits('0.000'.f64()) == 0
284+
assert '-0 ms'.f64().str() == '-0.0'
285+
assert '-0.0 ms'.f64().str() == '-0.0'
286+
assert '-0.000 ms'.f64().str() == '-0.0'
287+
assert '0 ms'.f64().str() == '0.0'
288+
assert '0.0 ms'.f64().str() == '0.0'
289+
assert '0.000 ms'.f64().str() == '0.0'
290+
assert '-0'.f64().str() == '-0.0'
291+
assert '-0.0'.f64().str() == '-0.0'
292+
assert '-0.000'.f64().str() == '-0.0'
293+
assert '0'.f64().str() == '0.0'
294+
assert '0.0'.f64().str() == '0.0'
295+
assert '0.00'.f64().str() == '0.0'
296+
}

‎vlib/strconv/atof.c.v‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ fn converter(mut pn PrepNumber) u64 {
247247
s0 = u32(pn.mantissa & u64(0x00000000FFFFFFFF))
248248
s1 = u32(pn.mantissa >> 32)
249249
s2 = u32(0)
250+
if pn.mantissa == 0 && pn.exponent <= 0 {
251+
return if pn.negative { double_minus_zero } else { double_plus_zero }
252+
}
250253
// so we take the decimal exponent off
251254
for pn.exponent > 0 {
252255
q2, q1, q0 = lsl96(s2, s1, s0) // q = s * 2

0 commit comments

Comments
 (0)