Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add Kelvin to Celsius conversion algorithm #2475

Merged
merged 5 commits into from
Jun 8, 2023
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
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@
* [Happy Number](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/happy_number.cpp)
* [Iterative Tree Traversals](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/iterative_tree_traversals.cpp)
* [Kadanes3](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/kadanes3.cpp)
* [Kelvin To Celsius](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/kelvin_to_celsius.cpp)
* [Lru Cache](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/lru_cache.cpp)
* [Matrix Exponentiation](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/matrix_exponentiation.cpp)
* [Palindrome Of Number](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/others/palindrome_of_number.cpp)
Expand Down
81 changes: 81 additions & 0 deletions others/kelvin_to_celsius.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/**
* @file
* @brief Conversion from [Kelvin to
* Celsius](https://byjus.com/chemistry/kelvin-to-celsius/) degrees.
* @details
* The algorithm consists on converting a Kelvin degree value to a Celsius
* value.
* The formula to convert a Kelvin to a Celsius value is:
* @f[ C = K - 273.15 @f] where:
* - C is the Celsius temperature
* - K is the Kelvin temperature
*
* Check out [Kelvin](https://en.wikipedia.org/wiki/Kelvin) and
* [Celsius](https://en.wikipedia.org/wiki/Celsius) on Wikipedia for more
* information about their story, how do they work, when and why they should be
* used, etc..
* @author [David Leal](https://github.com/Panquesito7)
*/

#include <cassert> /// for assert
#include <cmath> /// for std::abs
#include <iostream> /// for IO operations
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#include <iostream> /// for IO operations
#include <iostream> /// for std::cout

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IO operations is perfectly valid as we are doing input and output operations. And this is also how the documentation specifies

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@realstealthninja please have a look here.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I/O operations cout is an output operation it makes sense to me. You have to understand that if you want a change you don't do it through precedents because precedents are repelled and lost to time. If you want change create a discussion on it and if enough people agree it will be written into contribution.md. i am merely a man of the document it would be a much more useful debate if it was on the discussion board

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I don't think either should exist 🤷🏼. It is perfectly clear to every c++ programmer that starts out with a "Hello world" program what iostream is 😄 (just my 2 pennies)


/**
* @namespace
* @brief Other algorithms
*/
namespace others {
/**
* @brief Compare two floating point numbers with a certain tolerance.
* This is needed as with some values, the result (e.g.: -196.15) might be a bit
* lower (in this case, -196.499999...).
* @param a the first number to compare
* @param b the second number to compare
* @param tolerance the tolerance to use when comparing the numbers
* @returns true if the numbers ARE equal within the given tolerance
* @returns false if the numbers are NOT equal within the given tolerance
* otherwise
*/
bool are_almost_equal(double a, double b, double absolute_tolerance = 0.0001) {
return std::abs(a - b) < absolute_tolerance;
}

/**
* @brief Conversion from Kelvin to Celsius algorithm.
* @param number the Celsius number that will be used to convert
* @returns the Kelvin number converted to Celsius
*/
double kelvin_to_celsius(double temperature_in_k) {
const double absolute_zero_in_c = -273.15;
if (temperature_in_k < absolute_zero_in_c) {
throw std::invalid_argument("input temperature below absolute zero");
}
return temperature_in_k + absolute_zero_in_c;
}
} // namespace others

/**
* @brief Self-test implementations
* @returns void
*/
static void tests() {
assert(others::are_almost_equal(others::kelvin_to_celsius(230), -43.15));
assert(others::are_almost_equal(others::kelvin_to_celsius(512), 238.85));
assert(others::are_almost_equal(others::kelvin_to_celsius(55), -218.15));
assert(others::are_almost_equal(others::kelvin_to_celsius(77), -196.15));
assert(others::are_almost_equal(others::kelvin_to_celsius(9.78), -263.37));
assert(others::are_almost_equal(others::kelvin_to_celsius(15), -258.15));
assert(others::are_almost_equal(others::kelvin_to_celsius(273.15), 0));

std::cout << "All tests have successfully passed!\n";
}

/**
* @brief Main function
* @returns 0 on exit
*/
int main() {
tests(); // run self-test implementations
return 0;
}