diff options
| author | Terry Jan Reedy <tjreedy@udel.edu> | 2023-07-11 15:07:20 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-11 15:07:20 (GMT) |
| commit | a2d54d4e8ab12f967a220be88bde8ac8227c5ab3 (patch) | |
| tree | 3ea2f10c4be08cc2d2fe86f5d8328522e0704257 | |
| parent | 64c0890b697783db9b3f67e3bb4dcee1165a0b9b (diff) | |
| download | cpython-a2d54d4e8ab12f967a220be88bde8ac8227c5ab3.zip cpython-a2d54d4e8ab12f967a220be88bde8ac8227c5ab3.tar.gz cpython-a2d54d4e8ab12f967a220be88bde8ac8227c5ab3.tar.bz2 | |
gh-106498: Revert incorrect colorsys.rgb_to_hls change (#106627)
gh-86618 assumed a-b-c = a-(b+c) = a-d where d = b+d.
For floats 2.0, 1.0, and 0.9999999999999999, this assumption
is false. The net change of 1.1102230246251565e-16 to 0.0
results in division by 0. Revert the replacement. Add test.
| -rw-r--r-- | Lib/colorsys.py | 2 | ||||
| -rw-r--r-- | Lib/test/test_colorsys.py | 10 | ||||
| -rw-r--r-- | Misc/NEWS.d/next/Library/2023-07-11-09-25-40.gh-issue-106530.VgXrMx.rst | 2 |
3 files changed, 13 insertions, 1 deletions
diff --git a/Lib/colorsys.py b/Lib/colorsys.py index 9bdc83e..bc897bd 100644 --- a/Lib/colorsys.py +++ b/Lib/colorsys.py @@ -83,7 +83,7 @@ def rgb_to_hls(r, g, b): if l <= 0.5: s = rangec / sumc else: - s = rangec / (2.0-sumc) + s = rangec / (2.0-maxc-minc) # Not always 2.0-sumc: gh-106498. rc = (maxc-r) / rangec gc = (maxc-g) / rangec bc = (maxc-b) / rangec diff --git a/Lib/test/test_colorsys.py b/Lib/test/test_colorsys.py index a24e3ad..74d7629 100644 --- a/Lib/test/test_colorsys.py +++ b/Lib/test/test_colorsys.py @@ -69,6 +69,16 @@ class ColorsysTest(unittest.TestCase): self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb)) self.assertTripleEqual(rgb, colorsys.hls_to_rgb(*hls)) + def test_hls_nearwhite(self): # gh-106498 + values = ( + # rgb, hls: these do not work in reverse + ((0.9999999999999999, 1, 1), (0.5, 1.0, 1.0)), + ((1, 0.9999999999999999, 0.9999999999999999), (0.0, 1.0, 1.0)), + ) + for rgb, hls in values: + self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb)) + self.assertTripleEqual((1.0, 1.0, 1.0), colorsys.hls_to_rgb(*hls)) + def test_yiq_roundtrip(self): for r in frange(0.0, 1.0, 0.2): for g in frange(0.0, 1.0, 0.2): diff --git a/Misc/NEWS.d/next/Library/2023-07-11-09-25-40.gh-issue-106530.VgXrMx.rst b/Misc/NEWS.d/next/Library/2023-07-11-09-25-40.gh-issue-106530.VgXrMx.rst new file mode 100644 index 0000000..09fc647 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-07-11-09-25-40.gh-issue-106530.VgXrMx.rst @@ -0,0 +1,2 @@ +Revert a change to :func:`colorsys.rgb_to_hls` that caused division by zero +for certain almost-white inputs. Patch by Terry Jan Reedy. |
