* add contract and tests * avoid implicit cast * add test cases * fix test names * modify avarage and add tests * improve signed average formula * fix lint * better average formula * refactor signed average testing * add doc and changelog entry * Update contracts/utils/math/SignedMath.sol Co-authored-by: Francisco Giordano <frangio.1@gmail.com> * remove ceilDiv Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
33 lines
886 B
Solidity
33 lines
886 B
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.0;
|
|
|
|
/**
|
|
* @dev Standard signed math utilities missing in the Solidity language.
|
|
*/
|
|
library SignedMath {
|
|
/**
|
|
* @dev Returns the largest of two signed numbers.
|
|
*/
|
|
function max(int256 a, int256 b) internal pure returns (int256) {
|
|
return a >= b ? a : b;
|
|
}
|
|
|
|
/**
|
|
* @dev Returns the smallest of two signed numbers.
|
|
*/
|
|
function min(int256 a, int256 b) internal pure returns (int256) {
|
|
return a < b ? a : b;
|
|
}
|
|
|
|
/**
|
|
* @dev Returns the average of two signed numbers without overflow.
|
|
* The result is rounded towards zero.
|
|
*/
|
|
function average(int256 a, int256 b) internal pure returns (int256) {
|
|
// Formula from the book "Hacker's Delight"
|
|
int256 x = (a & b) + ((a ^ b) >> 1);
|
|
return x + (int256(uint256(x) >> 255) & (a ^ b));
|
|
}
|
|
}
|