diff --git a/changelog.md b/changelog.md index 8acd2120aef2..e2dbabbfd24d 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,10 @@ ## Changes affecting backward compatibility +- `-d:nimPreviewFloatRoundtrip` becomes the default. `system.addFloat` and `system.$` now can produce string representations of +floating point numbers that are minimal in size and possess round-trip and correct +rounding guarantees (via the +[Dragonbox](https://raw.githubusercontent.com/jk-jeon/dragonbox/master/other_files/Dragonbox.pdf) algorithm). ## Standard library additions and changes diff --git a/compiler/nim.cfg b/compiler/nim.cfg index ce5a22ad2ae1..87c35a711084 100644 --- a/compiler/nim.cfg +++ b/compiler/nim.cfg @@ -4,7 +4,6 @@ hint[XDeclaredButNotUsed]:off define:booting define:nimcore -define:nimPreviewFloatRoundtrip define:nimPreviewSlimSystem define:nimPreviewCstringConversion define:nimPreviewProcConversion diff --git a/lib/std/formatfloat.nim b/lib/std/formatfloat.nim index 9258245f6236..8e7c03710993 100644 --- a/lib/std/formatfloat.nim +++ b/lib/std/formatfloat.nim @@ -79,10 +79,7 @@ proc writeFloatToBufferSprintf*(buf: var array[65, char]; value: BiggestFloat): result = 3 proc writeFloatToBuffer*(buf: var array[65, char]; value: BiggestFloat | float32): int {.inline.} = - when defined(nimPreviewFloatRoundtrip) or defined(nimPreviewSlimSystem): - writeFloatToBufferRoundtrip(buf, value) - else: - writeFloatToBufferSprintf(buf, value) + writeFloatToBufferRoundtrip(buf, value) proc addFloatRoundtrip*(result: var string; x: float | float32) = when nimvm: @@ -126,16 +123,11 @@ proc addFloat*(result: var string; x: float | float32) {.inline.} = b = 45.67 s.addFloat(45.67) assert s == "foo:45.67" - template impl = - when defined(nimPreviewFloatRoundtrip) or defined(nimPreviewSlimSystem): - addFloatRoundtrip(result, x) - else: - addFloatSprintf(result, x) when defined(js): - when nimvm: impl() + when nimvm: addFloatRoundtrip(result, x) else: result.add nimFloatToString(x) - else: impl() + else: addFloatRoundtrip(result, x) when defined(nimPreviewSlimSystem): func `$`*(x: float | float32): string = diff --git a/tests/config.nims b/tests/config.nims index 0b2b66d81b6a..36111d855cc6 100644 --- a/tests/config.nims +++ b/tests/config.nims @@ -35,7 +35,6 @@ hint("Processing", off) switch("define", "nimExperimentalLinenoiseExtra") # preview APIs are expected to be the new default in upcoming versions -switch("define", "nimPreviewFloatRoundtrip") #switch("define", "nimPreviewDotLikeOps") # deprecated? switch("define", "nimPreviewJsonutilsHoleyEnum") switch("define", "nimPreviewHashRef") diff --git a/tests/float/tfloats.nim b/tests/float/tfloats.nim index aaed2d615b6a..a3c8da4551d6 100644 --- a/tests/float/tfloats.nim +++ b/tests/float/tfloats.nim @@ -1,5 +1,4 @@ discard """ - matrix: "-d:nimPreviewFloatRoundtrip; -u:nimPreviewFloatRoundtrip" targets: "c cpp js" """ @@ -66,29 +65,18 @@ template main = block: # example 1 let a = 0.1+0.2 doAssert a != 0.3 - when defined(nimPreviewFloatRoundtrip): - doAssert $a == "0.30000000000000004" - else: - whenRuntimeJs: discard - do: doAssert $a == "0.3" + doAssert $a == "0.30000000000000004" block: # example 2 const a = 0.1+0.2 - when defined(nimPreviewFloatRoundtrip): - doAssert $($a, a) == """("0.30000000000000004", 0.30000000000000004)""" - else: - whenRuntimeJs: discard - do: doAssert $($a, a) == """("0.3", 0.3)""" + doAssert $($a, a) == """("0.30000000000000004", 0.30000000000000004)""" block: # example 3 const a1 = 0.1+0.2 let a2 = a1 doAssert a1 != 0.3 - when defined(nimPreviewFloatRoundtrip): - doAssert $[$a1, $a2] == """["0.30000000000000004", "0.30000000000000004"]""" - else: - whenRuntimeJs: discard - do: doAssert $[$a1, $a2] == """["0.3", "0.3"]""" + doAssert $[$a1, $a2] == """["0.30000000000000004", "0.30000000000000004"]""" + - when defined(nimPreviewFloatRoundtrip): + when true: block: # bug #18148 var a = 1.1'f32 doAssert $a == "1.1", $a # was failing