From: Jean Privat Date: Fri, 21 Nov 2014 02:25:15 +0000 (-0500) Subject: Merge: lib: add Float::is_approx to compare floats X-Git-Tag: v0.6.11~23 X-Git-Url: http://nitlanguage.org?hp=9bb1267e3c47fc7168a9f9ef5605d2f563d00ff9 Merge: lib: add Float::is_approx to compare floats Pull-Request: #922 Reviewed-by: Lucas Bajolet Reviewed-by: Alexandre Terrasa Reviewed-by: Alexis Laferrière --- diff --git a/lib/standard/kernel.nit b/lib/standard/kernel.nit index 2e9c9ae..2f2df4b 100644 --- a/lib/standard/kernel.nit +++ b/lib/standard/kernel.nit @@ -331,6 +331,21 @@ universal Float end end + # Compare float numbers with a given precision. + # + # Because of the loss of precision in floating numbers, + # the `==` method is often not the best way to compare them. + # + # ~~~ + # assert 0.01.is_approx(0.02, 0.1) == true + # assert 0.01.is_approx(0.02, 0.001) == false + # ~~~ + fun is_approx(other, precision: Float): Bool + do + assert precision >= 0.0 + return self <= other + precision and self >= other - precision + end + redef fun max(other) do if self < other then diff --git a/tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res b/tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res index 56621b6..8229d05 100644 --- a/tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res +++ b/tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res @@ -1,4 +1,4 @@ -Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:374) +Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:389) 11 21 31 diff --git a/tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res b/tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res index 56621b6..8229d05 100644 --- a/tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res +++ b/tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res @@ -1,4 +1,4 @@ -Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:374) +Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:389) 11 21 31 diff --git a/tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res b/tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res index 56621b6..8229d05 100644 --- a/tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res +++ b/tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res @@ -1,4 +1,4 @@ -Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:374) +Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:389) 11 21 31 diff --git a/tests/sav/nituml_args3.res b/tests/sav/nituml_args3.res index af28f14..e248df6 100644 --- a/tests/sav/nituml_args3.res +++ b/tests/sav/nituml_args3.res @@ -41,7 +41,7 @@ Bool [ Object -> Bool [dir=back arrowtail=open style=dashed]; Float [ - label = "{Float||}" + label = "{Float||+ is_approx(other: Float, precision: Float): Bool\l}" ] Numeric -> Float [dir=back arrowtail=open style=dashed]; diff --git a/tests/sav/nituml_args4.res b/tests/sav/nituml_args4.res index 6189897..9a7b30f 100644 --- a/tests/sav/nituml_args4.res +++ b/tests/sav/nituml_args4.res @@ -41,7 +41,7 @@ Bool [ Object -> Bool [dir=back arrowtail=open style=dashed]; Float [ - label = "{Float||}" + label = "{Float||+ is_approx(other: Float, precision: Float): Bool\l}" ] Numeric -> Float [dir=back arrowtail=open style=dashed];