Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Codewars Handbook ☕️🚀

[![Views statistics +1 👀](https://img.shields.io/badge/dynamic/xml?color=success&label=views&query=//*[name()=%27text%27][3]&url=https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FParanoidUser%2Fcodewars-handbook)](https://hits.seeyoufarm.com/api/count/graph/dailyhits.svg?url=https://github.com/ParanoidUser/codewars-handbook)
[![Completed kata 👌](https://img.shields.io/badge/completed%20kata-69.3%25-red.svg)](https://www.codewars.com/kata/search/java?xids=completed)
[![Completed kata 👌](https://img.shields.io/badge/completed%20kata-69.2%25-red.svg)](https://www.codewars.com/kata/search/java?xids=completed)
[![CI pipeline 🛠](https://img.shields.io/github/actions/workflow/status/ParanoidUser/codewars-handbook/build.yml?branch=main)](https://github.com/ParanoidUser/codewars-handbook/actions/workflows/build.yml)
[![Quality gate 🔎](https://img.shields.io/sonar/alert_status/codewars-handbook?server=https%3A%2F%2Fsonarcloud.io)](https://sonarcloud.io/dashboard?id=codewars-handbook)
[![Let's have a chat! 📞](https://img.shields.io/gitter/room/ParanoidUser/codewars-handbook?color=49c39e)](https://gitter.im/ParanoidUser/codewars-handbook)
Expand All @@ -25,7 +25,7 @@ slug.

| [1 kyu](/kata/1-kyu/index.md) | [2 kyu](/kata/2-kyu/index.md) | [3 kyu](/kata/3-kyu/index.md) | [4 kyu](/kata/4-kyu/index.md) | [5 kyu](/kata/5-kyu/index.md) | [6 kyu](/kata/6-kyu/index.md) | [7 kyu](/kata/7-kyu/index.md) | [8 kyu](/kata/8-kyu/index.md) | [beta](/kata/beta/index.md) | [retired](/kata/retired/index.md) |
|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:---------------------------:|:---------------------------------:|
| 0 | 1 | 2 | 26 | 48 | 440 | 604 | 226 | 56 | 82 |
| 0 | 1 | 2 | 26 | 48 | 440 | 604 | 227 | 56 | 82 |

**Note:** The source code is written in Java 17 and may use language features that are incompatible
with Java 8, 11.
Expand Down
36 changes: 36 additions & 0 deletions kata/8-kyu/floating-point-comparison/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# [Floating point comparison](https://www.codewars.com/kata/floating-point-comparison "https://www.codewars.com/kata/5f9f43328a6bff002fa29eb8")

## Introduction

`float`s have limited precision and are unable to exactly represent some values. Rounding errors accumulate with repeated computation, and
numbers expected to be equal often differ slightly.

As a result, it is common advice to not use an exact equality comparison (`==`) with floats.

```
>>> a, b, c = 1e-9, 1e-9, 3.33e7
>>> (a + b) + c == a + (b + c)
False

>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
```

The solution is to check if a computed value is close to an expected value, without requiring them to be exactly equal. It seems very easy,
but many katas test float results the wrong way.

## Task

You have:

- a float value that comes from a computation and may have accumulated errors up to ±0.001
- a reference value

The function is bugged and sometimes returns wrong results.

Your task is to correct the bug.

## Note

This kata uses fixed tolerance for simplicity reasons, but usually relative tolerance is better. Fixed tolerance is useful for comparisons
near zero or when the magnitude of the values is known.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
interface FloatingPointComparison {
static boolean approxEquals(double a, double b) {
return Math.abs(a - b) < .001;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class FloatingPointComparisonTest {
@ParameterizedTest
@CsvSource(textBlock = """
-156.24037, -156.24038
123.2345, 123.234501
-1.234, -1.233999
98.7655, 98.7654999
-75158.25030, -75158.25017
""")
void sample(double a, double b) {
assertTrue(FloatingPointComparison.approxEquals(a, b));
}

@ParameterizedTest
@CsvSource(textBlock = """
175.9827, 82.25
1456.3652, 1456.3641
-7.28495, -7.28596
""")
void notEquals(double a, double b) {
assertFalse(FloatingPointComparison.approxEquals(a, b));
}
}
1 change: 1 addition & 0 deletions kata/8-kyu/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
- [Find the smallest integer in the array](find-the-smallest-integer-in-the-array)
- [FIXME: Replace all dots](fixme-replace-all-dots)
- [FIXME: Static electrickery](fixme-static-electrickery)
- [Floating point comparison](floating-point-comparison)
- [Formatting decimal places #0](formatting-decimal-places-number-0)
- [Fuel Calculator: Total Cost](fuel-calculator-total-cost)
- [Function 1 - hello world](function-1-hello-world)
Expand Down